2012-08-27 14 views
5

मैं HOUR_OF_DAY फ़ील्ड सेट करने और ग्रेगोरियन कैलेंडर दिनांक ऑब्जेक्ट का टाइमज़ोन बदलने की कोशिश कर रहा हूं।जावा ग्रेगोरियन कैलेंडर बदलें टाइमज़ोन

GregorianCalendar date = new GregorianCalendar(TimeZone.getTimeZone("GMT+10")); 
System.out.println("HOUR: " + date.get(Calendar.HOUR_OF_DAY)); 
date.set(Calendar.HOUR_OF_DAY, 23); 
//date.get(Calendar.HOUR_OF_DAY); 
date.setTimeZone(TimeZone.getTimeZone("GMT")); 
System.out.println("HOUR: " + date.get(Calendar.HOUR_OF_DAY)); 

आउटपुट:

HOUR: 16 
HOUR: 23 

HOUR_OF_DAY की किसी कारण मूल्य के लिए अलग अलग समय क्षेत्र सेट करने के बाद नहीं बदलता है। लेकिन अगर मैं date.get HOUR_OF_DAY के लिए uncomment, सब कुछ के रूप में वास्तव में काम करता है यह होना चाहिए

GregorianCalendar date = new GregorianCalendar(TimeZone.getTimeZone("GMT+10")); 
System.out.println("HOUR: " + date.get(Calendar.HOUR_OF_DAY)); 
date.set(Calendar.HOUR_OF_DAY, 23); 
date.get(Calendar.HOUR_OF_DAY); // uncommenting this line will is changing the output 
date.setTimeZone(TimeZone.getTimeZone("GMT")); 
System.out.println("HOUR: " + date.get(Calendar.HOUR_OF_DAY)); 

आउटपुट:

HOUR: 16 
HOUR: 13 

यह कैसे संभव है? क्यों .get विधि वस्तु व्यवहार बदल रहा है?

उत्तर

8

GregorianCalendar वर्ग Calendar से अपने get विधि है, जो निम्नलिखित पक्ष प्रभाव पड़ता है विरासत:

उदार मोड में, सभी कैलेंडर क्षेत्रों सामान्यीकृत होते हैं।

इसका मतलब यह है कि जब get एक Calendar वस्तु पर कहा जाता है time मूल्य और सभी क्षेत्रों की पुनर्गणना की जाती। इससे कुछ अप्रत्याशित व्यवहार हो सकते हैं, खासकर जब setTimeZone के साथ मिलकर, जिसमें documented buggy behavior स्वयं का है।

0

tl; डॉ

OffsetDateTime.now(ZoneOffset.ofHours(10) ).withHour(23) 

बचें विरासत तिथि-समय वर्गों

विरासत GregorianCalendar सहित तिथि-समय कक्षाएं एक भ्रमित कर रहे हैं। अजीब, खराब डिजाइन गड़बड़। उनसे बचें। अब java.time कक्षाओं द्वारा आपूर्ति की गई। विशेष रूप से, GregorianCalendar को ZonedDateTime द्वारा प्रतिस्थापित किया गया है।

ऑफसेट-से-यूटीसी

आप जाहिरा तौर पर एक दस में से offset-from-UTCUTC के आगे घंटे के साथ एक पल चाहते हैं। अपनी वांछित ऑफ़सेट परिभाषित करें।

ZoneOffset offset = ZoneOffset.ofHours(10) ; 

offset.toString(): 10: 00

साथ कि ऑफसेट एक OffsetDateTime के रूप में वर्तमान क्षण प्राप्त करें।

OffsetDateTime odt = OffsetDateTime.now(offset) ; 

odt.toString(): 2018-02-15T16: 44: ४४.२१६६४२ + 10: 00

आप घंटे ओवरराइड करने के लिए 23 होना चाहता हूँ।

OffsetDateTime odt23 = odt.withHour(23) ; 

odt23.toString(): 2018-02-15T23: 44: 44।216,642 + 10: 00

समय क्षेत्र

मैं HOUR_OF_DAY क्षेत्र की स्थापना की और ग्रेगोरी कैलेंडर की तारीख वस्तु की समय-क्षेत्र बदलने के लिए कोशिश कर रहा हूँ।

नहीं, आप offset-from-UTC बदल रहे हैं, time zone नहीं।

यदि आप निश्चित इच्छित क्षेत्र के लिए जानते हैं तो केवल ऑफसेट के बजाय समय क्षेत्र का उपयोग करना बेहतर है, । एक समय क्षेत्र एक निश्चित क्षेत्र के लोगों द्वारा उपयोग किए जाने वाले ऑफ़सेट में अतीत, वर्तमान और भविष्य के परिवर्तनों का इतिहास है। एक समय क्षेत्र के साथ आप हमेशा ऑफ़सेट निर्धारित कर सकते हैं, लेकिन इसके विपरीत नहीं।

ऐसे America/Montreal, Africa/Casablanca, या Pacific/Auckland रूप continent/region के प्रारूप में एक proper time zone name निर्दिष्ट करें,। 0-या IST जैसे 3-4 अक्षर संक्षेप का उपयोग न करें क्योंकि सही समय क्षेत्र, मानकीकृत नहीं, और यहां तक ​​कि अनूठा (!) भी नहीं है।

ZoneId z = ZoneId.of("Australia/Brisbane") ; 

उस क्षेत्र के लोगों द्वारा देखी गई दीवार घड़ी के समय में वर्तमान क्षण को कैप्चर करें।

ZonedDateTime zdt = ZonedDateTime.now(z) ; 

घंटे-प्रतिदिन ओवरराइड करें।

ZonedDateTime zdt23 = zdt.withHour(23) ; 

बारे java.time

java.time ढांचे जावा 8 और बाद में बनाया गया है। ये कक्षाएं परेशान पुराने legacy दिनांक-समय कक्षाएं जैसे java.util.Date, Calendar, & SimpleDateFormat प्रदान करती हैं।

Joda-Time प्रोजेक्ट, अब maintenance mode में, java.time कक्षाओं में माइग्रेशन की सलाह देता है।

और जानने के लिए, Oracle Tutorial देखें। और कई उदाहरणों और स्पष्टीकरणों के लिए स्टैक ओवरफ़्लो खोजें। विशिष्टता JSR 310 है।

एक JDBC driver अनुरूप JDBC 4.2 साथ या बाद में उपयोग करके आप अपने डाटाबेस के साथ java.time वस्तुओं सीधे का आदान-प्रदान कर सकते हैं। तारों की कोई ज़रूरत नहीं है और न ही java.sql। * कक्षाएं।

जावा.टाइम कक्षाएं कहां प्राप्त करें?

  • Java SE 8, Java SE 9, और बाद में
    • में निर्मित।
    • एक बंडल कार्यान्वयन के साथ मानक जावा एपीआई का हिस्सा।
    • जावा 9 कुछ मामूली विशेषताओं और सुधारों को जोड़ता है।
  • Java SE 6 और Java SE 7
    • java.time कार्यक्षमता की ज्यादातर ThreeTen-Backport में जावा 6 & से 7 वापस भेजा गया है।
  • Android
    • java.time वर्गों के एंड्रॉयड बंडल कार्यान्वयन के बाद के संस्करण।
    • पहले एंड्रॉइड के लिए, ThreeTenABP प्रोजेक्ट थ्रीटेन-बैकपोर्ट (ऊपर उल्लिखित) का अनुकूलन करता है। How to use ThreeTenABP… देखें।

ThreeTen-Extra परियोजना अतिरिक्त कक्षाओं के साथ java.time फैली हुई है। यह परियोजना java.time के संभावित भविष्य के जोड़ों के लिए एक सिद्ध भूमि है। आपको यहां कुछ उपयोगी कक्षाएं मिल सकती हैं जैसे Interval, YearWeek, YearQuarter, और more