में यूटीसी से 1 घंटे ऑफसेट किया गया था जहाँ तक मेरा बता सकते हैं देखते हैं यहां शामिल दो बग। java.util.Date
कक्षा में दोनों हैं (यदि मैं सही हूं) java.sql.Timestamp
का सुपरक्लास।
सबसे पहले, 1 9 00 में वॉरसॉ में ऑफसेट संक्रमण का कोई समय नहीं है। 1 9 15 में मेरा जावा 8 जानता है कि सबसे पुराना संक्रमण 1 9 15 में है। इसलिए वॉरसॉ हर समय जीएमटी से 1:24 ऑफसेट पर था जब हम चिंतित थे साथ में।
मैंने कोशिश की:
TimeZone.setDefault(TimeZone.getTimeZone("Europe/Warsaw"));
ZoneOffset offset0124 = ZoneOffset.ofHoursMinutes(1, 24);
System.out.println("" + new Date(0, 0, 1, 0, 59)
+ " -> " + new Date(0, 0, 1, 0, 59).toInstant().atOffset(offset0124));
System.out.println("" + new Date(0, 0, 1, 1, 14)
+ " -> " + new Date(0, 0, 1, 1, 14).toInstant().atOffset(offset0124));
System.out.println("" + new Date(0, 0, 1, 1, 24)
+ " -> " + new Date(0, 0, 1, 1, 24).toInstant().atOffset(offset0124));
यह प्रिंट:
Mon Jan 01 00:59:00 CET 1900 -> 1900-01-01T01:23+01:24
Mon Jan 01 01:38:00 CET 1900 -> 1900-01-01T01:38+01:24
Mon Jan 01 01:24:00 CET 1900 -> 1900-01-01T01:24+01:24
विधि Timestamp.valueOf
विधि आप परोक्ष रूप से एक पदावनत Date
निर्माता का उपयोग करता है का उपयोग करते हैं, इसलिए तो मैं (नहीं ठीक उसी निर्माता हूँ, मैं सेकंड के बिना एक का उपयोग कर रहा हूँ, भरोसा यह कोई फर्क नहीं पड़ता)। मैं ऊपर तीन मामलों पिछड़े पर टिप्पणी करेंगे:
- 1:24 सही ढंग से नियंत्रित किया जाता है, हम दोनों
Date.toString()
से और OffsetDateTime
से संभावित समय मिलता है।
- 1:14 को 1:38, 24 मिनट बाद माना जाता है। यह मेरे लिए एक बग की तरह दिखता है।
- 0:59 को 24:23 के बाद भी 1:23 के रूप में माना जाता है। हम इसे
OffsetDateTime
से देख सकते हैं। एक ही बग हालांकि, Date.toString()
अपेक्षित के रूप में 00:59 उत्पन्न करता है। ऐसा लगता है कि यह एक दूसरी बग है जो कि पहले किसी के लिए क्षतिपूर्ति करता है। मैंने जांच नहीं की है, लेकिन मुझे संदेह है कि इस बग का स्रोत भी Timestamp.toString()
गलत तरीके से व्यवहार करने का कारण बनता है।
चेक के रूप में मैंने आपके Timestamp
0:59 और 1:24 की वस्तुओं के बीच अंतर की गणना की। वांछित परिणाम 25 मिनट या 1 500 000 मिलीसेकंड है।कोड है:
System.out.println(java.sql.Timestamp.valueOf("1900-01-01 01:24:00").getTime()
- java.sql.Timestamp.valueOf("1900-01-01 00:59:00").getTime());
यह
60000
60 सेकंड, 1 मिनट के रूप में ही प्रिंट करता है। तो फिर भी उन दोनों टाइमस्टैम्प ने जिस तरह से उम्मीद की थी, उसमें मुद्रित किया गया, फिर भी इसमें एक बग शामिल है।
आपका लोकेल क्या है? केवल जावा 8 के माध्यम से जा रहा है, कोई स्कैला नहीं, मैं इसे अपने लोकेल (en_US) में पुन: उत्पन्न नहीं कर सकता। – rgettman
@rgettman 'zoneId.systemDefault' रिटर्न 'यूरोप/वारसॉ' –
मैंने इस समस्या को' System.setProperty (" user.timezone "," यूरोप/वारसॉ ") के साथ पुन: उत्पन्न किया;' ... मुझे एक बग की तरह दिखता है, और ... अतीत में टाइमज़ोन कीड़े रहे हैं। लाइब्रेरी कोड के माध्यम से कदम यह ऐसा लगता है कि उस अवधि के लिए जोनिनोफ़ डेटाबेस में एक फर्जी संक्रमण हो सकता है। यह सत्यापित करने के लिए कुछ काम करेगा, और मेरे पास अभी समय नहीं है, दुर्भाग्यवश। –