दिलचस्प पोस्ट
PHP चेतावनी अनुमति से इनकार (13) session_start पर () INSTALL_FAILED_NO_MATCHING_ABIS जब एपीके इंस्टॉल करें request.getQueryString () कुछ एन्कोडिंग की आवश्यकता है MongoDB के लिए रैम में "कार्य सेट" को फिट करने का क्या अर्थ है? PHP: HTTP प्रतिक्रिया कोड कैसे भेजें? जावास्क्रिप्ट के साथ वेब ऐप से मोबाइल सफारी में खोलने के लिए बल लिंक बेमेल परिभाषित () मॉड्यूल बेमेल पॉज़िंग पाश के लिए और अधिक कुशल तरीका चाहता था संस्करण 4.1 के रूप में ओपनजीएल में टेक्स्ट रेंडरिंग के लिए अत्याधुनिक क्या है? जावास्क्रिप्ट में एक आइफ्रेम के शरीर की सामग्री कैसे प्राप्त करें? जब त्रुटि.नेटवर्क रिस्पॉन्सस रिक्त है तो एंड्रॉइड वॉली में एचटीपीपी स्थिति कोड गतिशील रूप से चमकदार पृष्ठ का उपयोग करके वेब पेज पर प्लॉट जोड़ें PHP फ़ंक्शन ध्वज, कैसे? FileResult का उपयोग करते हुए Asp.Net MVC में किसी भी प्रकार की फ़ाइल डाउनलोड करें? आप जावा में ऑब्जेक्ट की एक गहरी कॉपी कैसे बनाते हैं?

जावा.टिल.डेट का समय क्षेत्र कैसे सेट करें?

मैंने एक String से एक java.util.Date को पार्स किया है लेकिन यह date ऑब्जेक्ट का टाइम ज़ोन के रूप में स्थानीय टाइम ज़ोन सेट कर रहा है।

टाइम ज़ोन को String में निर्दिष्ट नहीं किया जाता है जिसमें से Date को पार्स किया जाता है। मैं date ऑब्जेक्ट का एक विशिष्ट समय क्षेत्र सेट करना चाहता हूं।

मैं उसे कैसे कर सकता हूँ?

वेब के समाधान से एकत्रित समाधान "जावा.टिल.डेट का समय क्षेत्र कैसे सेट करें?"

तिथिफ़ॉर्मैट का उपयोग करें उदाहरण के लिए,

 SimpleDateFormat isoFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); isoFormat.setTimeZone(TimeZone.getTimeZone("UTC")); Date date = isoFormat.parse("2010-05-23T09:01:02"); 

जागरूक रहें कि java.util.Date ऑब्जेक्ट्स में स्वयं के द्वारा कोई समयक्षेत्र जानकारी नहीं है – आप Date ऑब्जेक्ट पर टाइमज़ोन सेट नहीं कर सकते। "युग" के बाद से 1 Date 1 9 70, 00:00:00 UTC के बाद से केवल एक Date ऑब्जेक्ट में मिलीसेकेंड की संख्या है।

जैसा कि ज़ेड ज़ोडर दिखाता है, आप DateFormat ऑब्जेक्ट पर DateFormat सेट करते हैं, यह बताने के लिए कि आप किस समय के समय और समय को प्रदर्शित करना चाहते हैं।

आप जेवीएम स्तर पर समयक्षेत्र भी निर्धारित कर सकते हैं

 Date date1 = new Date(); System.out.println(date1); TimeZone.setDefault(TimeZone.getTimeZone("UTC")); // or pass in a command line arg: -Duser.timezone="UTC" Date date2 = new Date(); System.out.println(date2); 

उत्पादन:

 Thu Sep 05 10:11:12 EDT 2013 Thu Sep 05 14:11:12 UTC 2013 

जूड में कोई समय क्षेत्र नहीं है

जैसा कि दूसरे सही उत्तरों में कहा गया है, एक जावा.उथिल.डेट का समय क्षेत्र नहीं है यह यूटीसी / जीएमटी (कोई समय क्षेत्र ऑफ़सेट नहीं) का प्रतिनिधित्व करता है बहुत भ्रामक है क्योंकि स्ट्रिंग प्रस्तुति उत्पन्न करते समय इसकी toString विधि JVM का डिफ़ॉल्ट समय क्षेत्र लागू करती है।

JuDate से बचें

इस और कई अन्य कारणों के लिए, आपको अंतर्निर्मित जावा। टिल। डेट एंड कैलेण्डर एंड जावा.टेक्स्ट। सिंपलडेट फ़ार्मैट का उपयोग करने से बचना चाहिए। वे कुख्यात परेशानी हैं

इसके बजाय जावा 8 के साथ बंडल जावा । टाइम पैकेज का उपयोग करें ये नई कक्षाएं जोडा-टाइम से प्रेरित हैं, जिसे JSR 310 द्वारा परिभाषित किया गया है, और तीन-अतिरिक्त-अतिरिक्त प्रोजेक्ट द्वारा बढ़ाया गया है। जावा 6 और 7 के लिए, बैक-पोर्ट प्रोजेक्ट, थ्रीटीन-बैकपोर्ट का उपयोग करें एंड्रॉइड के लिए, उस बैक-पोर्ट, 3TenABP का अनुकूलन । ओरेकल ट्यूटोरियल देखें

java.time

Java.time वर्ग समय पर तीन तरीकों से एक क्षण का प्रतिनिधित्व कर सकते हैं:

  • UTC ( Instant )
  • ऑफ़सेट के साथ ( OffsetDateTime साथ)
  • एक टाइम ज़ोन (ज़ोन ZonedDateTime साथ ज़ोन ZoneId )

Instant

Java.time में , मूल इमारत ब्लॉक Instant , यूटीसी में समय रेखा पर एक पल। आपके व्यवसाय तर्क के अधिक के लिए Instant ऑब्जेक्ट का उपयोग करें

 Instant instant = Instant.now(); 

OffsetDateTime

कुछ इलाके की दीवार-घड़ी के समय में समायोजित करने के लिए ऑफसेट-यूटीसी लागू करें

ZoneOffset पाने के लिए एक ZoneOffset लागू करें

 ZoneOffset zoneOffset = ZoneOffset.of( "-04:00" ); OffsetDateTime odt = OffsetDateTime.ofInstant( instant , zoneOffset ); 

ZonedDateTime

बेहतर समय क्षेत्र , एक ऑफसेट प्लस नियम जैसे डेलाइट सेविंग टाइम (डीएसटी) जैसे विसंगतियों को निपटाने के लिए नियम लागू करना है।

ZoneId प्राप्त करने के लिए Instant को एक ZoneId लागू करें। हमेशा उचित समय क्षेत्र का नाम निर्दिष्ट करें । EST या IST जैसे 3-4 संक्षिप्त नाम का प्रयोग न करें जो न तो अद्वितीय हैं और न ही मानकीकृत हैं।

 ZoneId zoneId = ZoneId.of( "America/Montreal" ); ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId ); 

प्रारूपित स्ट्रिंग्स

मानक ISO 8601 प्रारूप में दिनांक-समय मान का प्रतिनिधित्व करने वाला स्ट्रिंग उत्पन्न करने के लिए इन तीन वर्गों में से किसी भी स्ट्रिंग विधि को कॉल करें। ZonedDateTime क्लास टाइम ज़ोन के ब्रैकेट्स के नाम को जोड़कर मानक प्रारूप को बढ़ाता है।

 String outputInstant = instant.toString(); // Ex: 2011-12-03T10:15:30Z String outputOdt = odt.toString(); // Ex: 2007-12-03T10:15:30+01:00 String outputZdt = zdt.toString(); // Ex: 2007-12-03T10:15:30+01:00[Europe/Paris] 

अन्य प्रारूपों के लिए DateTimeFormatter वर्ग का उपयोग करें। आम तौर पर सबसे अच्छा यह है कि यह क्लास उपयोगकर्ता की अपेक्षित मानव भाषा और सांस्कृतिक मानदंडों का उपयोग करके स्थानीय प्रारूपों को उत्पन्न करता है। या आप एक विशिष्ट प्रारूप निर्दिष्ट कर सकते हैं।


Joda समय

जबकि जोडा-टाइम अभी भी सक्रिय रूप से बनाए रखा गया है, इसके निर्माताओं ने हमें बताया है कि जावा के समय में माइग्रेट करने के लिए सुविधाजनक है। मैं एक संदर्भ के रूप में इस खंड को बरकरार java.time हूं, लेकिन मैं इसके बजाय ऊपर java.time अनुभाग का उपयोग करने का सुझाव देता हूं।

जोडा-टाइम में , एक डेट-टाइम ऑब्जेक्ट ( DateTime ) वास्तव में इसके नियत समय क्षेत्र को जानता है। इसका अर्थ है कि यूटीसी से ऑफसेट और उस समय क्षेत्र के डेलाइट सेविंग टाइम (डीएसटी) के नियमों और इतिहास और अन्य ऐसी अनियमितताएं

 String input = "2014-01-02T03:04:05"; DateTimeZone timeZone = DateTimeZone.forID( "Asia/Kolkata" ); DateTime dateTimeIndia = new DateTime( input, timeZone ); DateTime dateTimeUtcGmt = dateTimeIndia.withZone( DateTimeZone.UTC ); 

आईएसओ 8601 प्रारूप में एक स्ट्रिंग उत्पन्न करने के लिए toString विधि को कॉल करें।

 String output = dateTimeIndia.toString(); 

जोडा-टाइम सभी प्रकार के अन्य स्ट्रिंग प्रारूपों को उत्पन्न करने के लिए समृद्ध क्षमताएं भी प्रदान करता है।

यदि आवश्यक हो, तो आप Joda-Time DateTime से java.util.Date में कनवर्ट कर सकते हैं।

 Java.util.Date date = dateTimeIndia.toDate(); 

अधिक से अधिक उदाहरण ढूंढने के लिए "जोडा तिथि" के लिए स्टैक ओवरफ्लो खोजें, कुछ बहुत विस्तृत।


वास्तव में एक समय क्षेत्र जो जावा.अटिल.डेट में एम्बेडेड है, कुछ आंतरिक कार्यों के लिए उपयोग किया गया है (इस उत्तर पर टिप्पणी देखें)। लेकिन यह आंतरिक समय क्षेत्र किसी संपत्ति के रूप में सामने नहीं आ रहा है, और इसे सेट नहीं किया जा सकता। यह आंतरिक समय क्षेत्र, डेट-टाइम मान की स्ट्रिंग का प्रतिनिधित्व करने के लिए toString विधि द्वारा उपयोग में नहीं आता है; इसके बजाय जेवीएम के वर्तमान डिफ़ॉल्ट समय क्षेत्र को-मक्खी पर लागू किया जाता है। तो, लघुकथा के रूप में, हम अक्सर कहते हैं "जूडट का समय क्षेत्र नहीं है" भ्रामक? हाँ। इन थके हुए पुराने वर्गों से बचने के लिए एक और कारण है।

java.util.Calendar सिर्फ जेडीके कक्षाओं का उपयोग करते हुए समय ज़ोन को संभालने का सामान्य तरीका है। अपाचे कॉमन्स के पास कुछ और विकल्प / उपयोगिताओं हैं जो उपयोगी हो सकते हैं स्पॉन्ग के नोट को संपादित करते हुए मुझे याद दिलाया कि मैंने जोडा-टाइम के बारे में बहुत अच्छी बातें सुनाई हैं (हालांकि मैंने इसे खुद नहीं प्रयोग किया है)।

अगर आपको केवल मानक जेडीके कक्षाओं के साथ काम करना चाहिए तो आप इसका उपयोग कर सकते हैं:

 /** * Converts the given <code>date</code> from the <code>fromTimeZone</code> to the * <code>toTimeZone</code>. Since java.util.Date has does not really store time zome * information, this actually converts the date to the date that it would be in the * other time zone. * @param date * @param fromTimeZone * @param toTimeZone * @return */ public static Date convertTimeZone(Date date, TimeZone fromTimeZone, TimeZone toTimeZone) { long fromTimeZoneOffset = getTimeZoneUTCAndDSTOffset(date, fromTimeZone); long toTimeZoneOffset = getTimeZoneUTCAndDSTOffset(date, toTimeZone); return new Date(date.getTime() + (toTimeZoneOffset - fromTimeZoneOffset)); } /** * Calculates the offset of the <code>timeZone</code> from UTC, factoring in any * additional offset due to the time zone being in daylight savings time as of * the given <code>date</code>. * @param date * @param timeZone * @return */ private static long getTimeZoneUTCAndDSTOffset(Date date, TimeZone timeZone) { long timeZoneDSTOffset = 0; if(timeZone.inDaylightTime(date)) { timeZoneDSTOffset = timeZone.getDSTSavings(); } return timeZone.getRawOffset() + timeZoneDSTOffset; } 

क्रेडिट इस पोस्ट को जाता है

यदि किसी को कभी भी इसकी आवश्यकता है, यदि आपको XMLGregorianCalendar से अपने वर्तमान समयक्षेत्र में एक XMLGregorianCalendar समयक्षेत्र को बदलने की आवश्यकता है, तो आपको केवल समय क्षेत्र को 0 सेट कर दिया गया है, फिर से कॉल toGregorianCalendar() – यह एक ही समय क्षेत्र बनेगा, लेकिन Date जानता है कि इसे अपने में बदलने के लिए, ताकि आप वहां से डेटा प्राप्त कर सकें।

 XMLGregorianCalendar xmlStartTime = DatatypeFactory.newInstance() .newXMLGregorianCalendar( ((GregorianCalendar)GregorianCalendar.getInstance()); xmlStartTime.setTimezone(0); GregorianCalendar startCalendar = xmlStartTime.toGregorianCalendar(); Date startDate = startCalendar.getTime(); XMLGregorianCalendar xmlStartTime = DatatypeFactory.newInstance() .newXMLGregorianCalendar(startCalendar); xmlStartTime.setHour(startDate.getHours()); xmlStartTime.setDay(startDate.getDate()); xmlStartTime.setMinute(startDate.getMinutes()); xmlStartTime.setMonth(startDate.getMonth()+1); xmlStartTime.setTimezone(-startDate.getTimezoneOffset()); xmlStartTime.setSecond(startDate.getSeconds()); xmlStartTime.setYear(startDate.getYear() + 1900); System.out.println(xmlStartTime.toString()); 

परिणाम:

 2015-08-26T12:02:27.183Z 2015-08-26T14:02:27.183+02:00