tl; डॉ
वहाँ एक तरीका है, या तो कोड में या JVM तर्कों के साथ, वर्तमान समय को ओवरराइड करने के लिए, जैसा कि System.currentTimeMillis के माध्यम से प्रस्तुत किया गया है, मेजबान मशीन पर सिस्टम घड़ी को मैन्युअल रूप से बदलने के अलावा?
हाँ।
Instant.now(
Clock.fixed(
Instant.parse( "2016-01-23T12:34:56Z"), ZoneOffset.UTC
)
)
Clock
Java.time में
हमारे पास फॉक्स डेट-टाइम मान के साथ परीक्षण की सुविधा के लिए एक प्लग करने योग्य घड़ी प्रतिस्थापन की समस्या का एक नया समाधान है । Java.time पैकेज में जावा 8 एक अमूर्त वर्ग भी शामिल है java.time.Clock
, एक स्पष्ट उद्देश्य के साथ:
आवश्यकता पड़ने पर वैकल्पिक घड़ियों को प्लग करने की अनुमति दें
आप अपने स्वयं के कार्यान्वयन में प्लग Clock
कर सकते हैं, हालांकि आप अपनी आवश्यकताओं को पूरा करने के लिए पहले से ही बना हुआ पा सकते हैं। आपकी सुविधा के लिए, java.time में विशेष कार्यान्वयन प्राप्त करने के लिए स्थिर तरीके शामिल हैं। ये वैकल्पिक कार्यान्वयन परीक्षण के दौरान मूल्यवान हो सकते हैं।
बदल गया ताल
विभिन्न tick…
विधियाँ घड़ियों का निर्माण करती हैं जो एक अलग ताल के साथ वर्तमान क्षण को बढ़ाती हैं।
डिफ़ॉल्ट Clock
समय जावा 8 में मिलीसेकंड और जावा 9 में नैनोसेकंड (अपने हार्डवेयर पर निर्भर करता है) के रूप में अक्सर अपडेट किए गए समय की रिपोर्ट करता है। आप सही वर्तमान क्षण के लिए एक अलग ग्रैन्युलैरिटी के साथ रिपोर्ट करने के लिए कह सकते हैं।
झूठी घड़ियाँ
कुछ घड़ियाँ झूठ बोल सकती हैं, जो मेजबान OS की हार्डवेयर घड़ी की तुलना में भिन्न परिणाम देती हैं।
fixed
- वर्तमान क्षण के रूप में एक एकल अपरिवर्तनीय (गैर-वृद्धि) पल की रिपोर्ट करता है।
offset
- वर्तमान क्षण की रिपोर्ट करता है लेकिन पारित Duration
तर्क द्वारा स्थानांतरित कर दिया गया ।
उदाहरण के लिए, इस वर्ष के शुरुआती क्रिसमस के पहले क्षण में ताला। दूसरे शब्दों में, जब सांता और उसके हिरन अपना पहला पड़ाव बनाते हैं । जल्द से जल्द समय क्षेत्र आजकल हो रहा है Pacific/Kiritimati
पर +14:00
।
LocalDate ld = LocalDate.now( ZoneId.of( "America/Montreal" ) );
LocalDate xmasThisYear = MonthDay.of( Month.DECEMBER , 25 ).atYear( ld.getYear() );
ZoneId earliestXmasZone = ZoneId.of( "Pacific/Kiritimati" ) ;
ZonedDateTime zdtEarliestXmasThisYear = xmasThisYear.atStartOfDay( earliestXmasZone );
Instant instantEarliestXmasThisYear = zdtEarliestXmasThisYear.toInstant();
Clock clockEarliestXmasThisYear = Clock.fixed( instantEarliestXmasThisYear , earliestXmasZone );
हमेशा उसी पल को लौटाने के लिए उस विशेष निश्चित घड़ी का उपयोग करें। हमें किरीटीमाटी में क्रिसमस के दिन का पहला क्षण मिलता है , यूटीसी के साथ चौदह घंटे पहले की दीवार-घड़ी का समय दिखाते हुए, 24 दिसंबर की पूर्व तारीख को सुबह 10 बजे।
Instant instant = Instant.now( clockEarliestXmasThisYear );
ZonedDateTime zdt = ZonedDateTime.now( clockEarliestXmasThisYear );
तत्काल .toString (): 2016-12-24T10: 00: 00Z
zdt.toString (): 2016-12-25T00: 00 + 14: 00 [प्रशांत / किरीटीमाटी]
IdeOne.com में लाइव कोड देखें ।
सही समय, अलग समय क्षेत्र
आप नियंत्रित कर सकते हैं कि कौन सा समय क्षेत्र Clock
कार्यान्वयन द्वारा सौंपा गया है । यह कुछ परीक्षण में उपयोगी हो सकता है। लेकिन मैं इसे उत्पादन कोड में अनुशंसित नहीं करता हूं, जहां आपको हमेशा स्पष्ट रूप से वैकल्पिक ZoneId
या निर्दिष्ट करना चाहिएZoneOffset
तर्क ।
आप निर्दिष्ट कर सकते हैं कि UTC डिफ़ॉल्ट ज़ोन है।
ZonedDateTime zdtClockSystemUTC = ZonedDateTime.now ( Clock.systemUTC () );
आप किसी विशेष समय क्षेत्र को निर्दिष्ट कर सकते हैं। एक निर्दिष्ट उचित समय क्षेत्र नाम के प्रारूप में continent/region
, इस तरह के रूप America/Montreal
, Africa/Casablanca
, या Pacific/Auckland
। कभी इस तरह के रूप में 3-4 पत्र संक्षिप्त नाम का उपयोग EST
या IST
के रूप में वे कर रहे हैं नहीं सच समय क्षेत्र, नहीं मानकीकृत, और यहां तक कि अद्वितीय नहीं (!)।
ZonedDateTime zdtClockSystem = ZonedDateTime.now ( Clock.system ( ZoneId.of ( "America/Montreal" ) ) );
आप निर्दिष्ट कर सकते हैं जेवीएम का वर्तमान डिफ़ॉल्ट समय क्षेत्र किसी विशेष Clock
वस्तु के लिए डिफ़ॉल्ट होना चाहिए ।
ZonedDateTime zdtClockSystemDefaultZone = ZonedDateTime.now ( Clock.systemDefaultZone () );
तुलना करने के लिए इस कोड को चलाएं। ध्यान दें कि वे सभी एक ही पल की रिपोर्ट करते हैं, समयरेखा पर समान बिंदु। वे केवल दीवार-घड़ी के समय में भिन्न होते हैं ; दूसरे शब्दों में, एक ही बात कहने के तीन तरीके, एक ही पल को प्रदर्शित करने के तीन तरीके।
System.out.println ( "zdtClockSystemUTC.toString(): " + zdtClockSystemUTC );
System.out.println ( "zdtClockSystem.toString(): " + zdtClockSystem );
System.out.println ( "zdtClockSystemDefaultZone.toString(): " + zdtClockSystemDefaultZone );
America/Los_Angeles
इस कोड को चलाने वाले कंप्यूटर पर JVM करंट डिफॉल्ट ज़ोन था।
zdtClockSystemUTC.toString (): 2016-12-31T20: 52: 39.688Z
zdtClockSystem.toString (): 2016-12-31T15: 52: 39.750-05: 00 [अमेरिका / मॉन्ट्रियल]
zdtClockSystemDefaultZone.toString (): 2016-12-31T12: 52: 39.762-08: 00 [अमेरिका / Los_Angeles]
Instant
वर्ग परिभाषा के द्वारा यूटीसी में हमेशा होता है। इसलिए इन तीनों ज़ोन से जुड़े Clock
प्रयोगों का ठीक वैसा ही प्रभाव होता है।
Instant instantClockSystemUTC = Instant.now ( Clock.systemUTC () );
Instant instantClockSystem = Instant.now ( Clock.system ( ZoneId.of ( "America/Montreal" ) ) );
Instant instantClockSystemDefaultZone = Instant.now ( Clock.systemDefaultZone () );
InstantClockSystemUTC.toString (): 2016-12-31T20: 52: 39.763Z
InstantClockSystem.toString (): 2016-12-31T20: 52: 39.763Z
InstantClockSystemDefaultZone.toString (): 2016-12-31T20: 52: 39.763Z
डिफ़ॉल्ट घड़ी
इसके लिए डिफ़ॉल्ट रूप से उपयोग किया गया कार्यान्वयन Instant.now
उसी के द्वारा लौटाया जाता है Clock.systemUTC()
। जब आप निर्दिष्ट नहीं करते हैं तो यह कार्यान्वयन होता है Clock
। स्वयं देखें में के लिए रिलीज जावा 9 स्रोत कोडInstant.now
।
public static Instant now() {
return Clock.systemUTC().instant();
}
के लिए डिफ़ॉल्ट Clock
है OffsetDateTime.now
और ZonedDateTime.now
है Clock.systemDefaultZone()
। स्रोत कोड देखें ।
public static ZonedDateTime now() {
return now(Clock.systemDefaultZone());
}
जावा 8 और जावा 9 के बीच डिफ़ॉल्ट कार्यान्वयन का व्यवहार बदल गया है। जावा 8 में, वर्तमान क्षण को नैनोसेकंड के रिज़ॉल्यूशन को संग्रहीत करने की कक्षाओं की क्षमता के बावजूद केवल मिलीसेकंड में रिज़ॉल्यूशन के साथ कैप्चर किया गया है । जावा 9 एक नया कार्यान्वयन लाता है जो वर्तमान क्षण को नैनोसेकंड के एक संकल्प के साथ कैप्चर करने में सक्षम है - यह आपके कंप्यूटर हार्डवेयर घड़ी की क्षमता पर निर्भर करता है।
के बारे में जावा के
Java.time ढांचे जावा 8 और बाद में बनाया गया है। इन कक्षाओं परेशानी वर्ष प्रतिस्थापित विरासत जैसे तिथि-समय कक्षाएं java.util.Date
, Calendar
, औरSimpleDateFormat
।
अधिक जानने के लिए, Oracle ट्यूटोरियल देखें । और कई उदाहरणों और स्पष्टीकरणों के लिए ढेर अतिप्रवाह खोजें। विशिष्टता JSR 310 है ।
Joda समय परियोजना, अब में रखरखाव मोड , प्रवास करने की सलाह देता java.time कक्षाएं।
आप अपने डेटाबेस से सीधे java.time वस्तुओं का आदान-प्रदान कर सकते हैं । JDBC 4.2 या उसके बाद के JDBC ड्राइवर का अनुपालन करें । तारों की कोई जरूरत नहीं, कक्षाओं की कोई जरूरत नहीं । हाइबरनेट 5 और जेपीए 2.2 जावा का समर्थन करते हैं ।java.sql.*
Java.time कक्षाएं कहाँ से प्राप्त करें?