java - जावा में टाइमज़ोन का उपयोग करके डेलाइट बचत से कैसे निपटें




date calendar timezone (6)

इस answer अनुसार:

TimeZone tz = TimeZone.getTimeZone("EST");
boolean inDs = tz.inDaylightTime(new Date());

मुझे अपने जावा एप्लिकेशन में ईएसटी समय प्रिंट करना होगा। मैंने समय क्षेत्र को ईएसटी का उपयोग करके सेट किया था:

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("EST"));

लेकिन जब इस टाइमज़ोन में डेलाइट बचत का पालन किया जा रहा है, तो मेरा कोड सही समय प्रिंट नहीं करता है (यह 1 घंटे कम प्रिंट करता है)।

सही समय को पढ़ने के लिए कोड को कैसे काम करना है, भले ही डेलाइट बचत देखी जा रही हो या नहीं?

पीएस: मैंने टाइमज़ोन को ईडीटी में सेट करने का प्रयास किया, लेकिन यह समस्या का समाधान नहीं करता है।


टाइमज़ोन के लिए "ईएसटी" दर्ज करने के बजाय आप "EST5EDT" दर्ज कर सकते हैं। जैसा कि आपने नोट किया है, बस "ईडीटी" काम नहीं करता है। यह डेलाइट बचत समय के मुद्दे के लिए जिम्मेदार होगा। कोड लाइन इस तरह दिखती है:

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("EST5EDT"));

अन्य उत्तरों सही हैं, खासकर जॉन स्कीट द्वारा , लेकिन पुराना है।

java.time

जावा 8 और बाद में बनाए गए java.time फ्रेमवर्क द्वारा इन पुरानी डेट-टाइम कक्षाओं की आपूर्ति की गई है।

यदि आप बस यूटीसी में वर्तमान समय चाहते हैं, तो Instant कक्षा का उपयोग करें।

Instant now = Instant.now();

EST एक समय क्षेत्र नहीं है, जैसा कि जॉन स्कीट द्वारा सही उत्तर में बताया गया है। ऐसे 3-4 अक्षर कोड न तो मानकीकृत हैं और न ही अद्वितीय हैं, और आगे डेलाइट सेविंग टाइम (डीएसटी) पर भ्रम हैं। "महाद्वीप / क्षेत्र" प्रारूप में उचित समय क्षेत्र का नाम उपयोग करें।

शायद आप उत्तरी अमेरिका के पूर्वी तट में पूर्वी मानक समय का मतलब था? या मिस्र मानक समय? या यूरोपीय मानक समय?

ZoneId zoneId = ZoneId.of( "America/New_York" );
ZoneId zoneId = ZoneId.of( "Africa/Cairo" );
ZoneId zoneId = ZoneId.of( "Europe/Lisbon" );

ZoneId ऑब्जेक्ट का उत्पादन करने के लिए किसी विशेष समय क्षेत्र में समायोजित वर्तमान पल प्राप्त करने के लिए ऐसी किसी भी ZoneId ऑब्जेक्ट का उपयोग करें।

ZonedDateTime zdt = ZonedDateTime.now( zoneId ) ;

पहले से एक और ZonedDateTime ऑब्जेक्ट का उत्पादन करके ZonedDateTime को एक अलग समय क्षेत्र में समायोजित करें। जावा.टाइम फ्रेमवर्क मौजूदा वस्तुओं को बदलने (म्यूटेट करने) के बजाय अपरिवर्तनीय वस्तुओं का उपयोग करता है।

ZonedDateTime zdtGuam = zdt.withZoneSameInstant( ZoneId.of( "Pacific/Guam" ) ) ;

कैलेंडर में टाइमज़ोन सेट करने के लिए टाइमज़ोन क्लास को कार्यान्वित करना डेलाइट बचत का ख्याल रखता है।

java.util.TimeZone एक समय क्षेत्र ऑफ़सेट का प्रतिनिधित्व करता है, और डेलाइट बचत का भी आंकलन करता है।

नमूना कोड:

TimeZone est_timeZone = TimeZoneIDProvider.getTimeZoneID(TimeZoneID.US_EASTERN).getTimeZone();
Calendar enteredCalendar = Calendar.getInstance();
enteredCalendar.setTimeZone(est_timeZone);

यह शुरू करने में समस्या है:

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("EST"));

3-अक्षर संक्षेपों को पूरी तरह से टीजेडीबीबी जोन आईडी के पक्ष में टालना चाहिए। ईएसटी पूर्वी मानक समय है - और मानक समय कभी डीएसटी नहीं देखता है; यह वास्तव में एक पूर्णकालिक क्षेत्र का नाम नहीं है। यह समय क्षेत्र के हिस्से के लिए उपयोग किया जाने वाला नाम है। (दुर्भाग्य से मैं इस "आधा समय क्षेत्र" अवधारणा के लिए एक अच्छी अवधि में नहीं आया है।)

आप एक पूर्णकालिक क्षेत्र का नाम चाहते हैं। उदाहरण के लिए, America/New_York पूर्वी समय क्षेत्र में है:

TimeZone zone = TimeZone.getTimeZone("America/New_York");
DateFormat format = DateFormat.getDateTimeInstance();
format.setTimeZone(zone);

System.out.println(format.format(new Date()));

उपयोग:

minimum + rn.nextInt(maxValue - minvalue + 1)




java date calendar timezone