tl; डॉ
LocalDate // Represents an entire day, without time-of-day and without time zone.
.now( // Capture the current date.
ZoneId.of( "Asia/Tokyo" ) // Returns a `ZoneId` object.
) // Returns a `LocalDate` object.
.atStartOfDay( // Determines the first moment of the day as seen on that date in that time zone. Not all days start at 00:00!
ZoneId.of( "Asia/Tokyo" )
) // Returns a `ZonedDateTime` object.
दिन की शुरुआत
आज की पूरी लंबाई प्राप्त करें जैसा कि एक समय क्षेत्र में देखा जाता है।
हाफ-ओपन दृष्टिकोण का उपयोग करना, जहां शुरुआत समावेशी है जबकि अंत अनन्य है । यह दृष्टिकोण आपके कोड की खामियों को हल करता है जो दिन के बहुत अंतिम समय तक खाते में विफल रहता है।
ZoneId zoneId = ZoneId.of( "Africa/Tunis" ) ;
LocalDate today = LocalDate.now( zoneId ) ;
ZonedDateTime zdtStart = today.atStartOfDay( zoneId ) ;
ZonedDateTime zdtStop = today.plusDays( 1 ).atStartOfDay( zoneId ) ;
zdtStart.toString () = 2020-01-30T00: 00 + 01: 00 [अफ्रीका / ट्यूनिस]
zdtStop.toString () = 2020-01-31T00: 00 + 01: 00 [अफ्रीका / ट्यूनिस]
यूटीसी में उसी क्षण देखें।
Instant start = zdtStart.toInstant() ;
Instant stop = zdtStop.toInstant() ;
start.toString () = 2020-01-29T23: 00: 00Z
stop.toString () = 2020-01-30T23: 00: 00Z
यदि आप एक समय क्षेत्र के बजाय UTC में देखे गए दिनांक का पूरा दिन चाहते हैं, तो उपयोग करें OffsetDateTime।
LocalDate today = LocalDate.now( ZoneOffset.UTC ) ;
OffsetDateTime odtStart = today.atTime( OffsetTime.MIN ) ;
OffsetDateTime odtStop = today.plusDays( 1 ).atTime( OffsetTime.MIN ) ;
odtStart.toString () = 2020-01-30T00: 00 + 18: 00
odtStop.toString () = 2020-01-31T00: 00 + 18: 00
ये OffsetDateTime ऑब्जेक्ट पहले से ही UTC में होंगे, लेकिन आप कॉल कर सकते हैं toInstantयदि आपको ऐसी ऑब्जेक्ट्स की जरूरत है जो हमेशा UTC में हों।
Instant start = odtStart.toInstant() ;
Instant stop = odtStop.toInstant() ;
start.toString () = 2020-01-29T06: 00: 00Z
stop.toString () = 2020-01-30T06: 00: 00Z
सुझाव: आप इस जोड़ी वस्तुओं का प्रतिनिधित्व करने के लिए अपनी कक्षा का उपयोग करने के लिए अपनी परियोजना में थ्रीटेन-अतिरिक्त पुस्तकालय को जोड़ने में रुचि रख सकते हैं। यह वर्ग तुलना के लिए उपयोगी तरीके प्रदान करता है जैसे ,IntervalInstantabutsoverlaps , contains, और अधिक।
Interval interval = Interval.of( start , stop ) ;
interval.toString () = 2020-01-29T06: 00: 00Z / 2020-01-30T06: 00: 00Z
आधा खुला
Mprivat द्वारा जवाब सही है। उनका कहना है कि एक दिन के अंत को प्राप्त करने की कोशिश न करें, बल्कि "अगले दिन की शुरुआत से पहले" की तुलना करें। उनके विचार को "हाफ-ओपन" दृष्टिकोण के रूप में जाना जाता है जहां समय की अवधि में एक शुरुआत होती है जो कि समावेशी होती है अंत में अनन्य होती है ।
- जावा की वर्तमान तिथि-समय की रूपरेखा (java.util.Date/Calendar और Joda-Time ) से दोनों का उपयोग मिलीसेकेंड युग । लेकिन जावा 8 में, नया JSR 310 java.time। * कक्षाएं नैनोसेकंड रिज़ॉल्यूशन का उपयोग करती हैं। आपके द्वारा लिखे गए किसी भी कोड को दिन के अंतिम क्षणों की मिलीसेकंड गणना के आधार पर लिखा जाता है, यदि नई कक्षाओं में स्विच किया जाता है तो यह गलत होगा।
- यदि वे अन्य प्रस्तावों को नियोजित करते हैं तो अन्य स्रोतों से डेटा की तुलना करना दोषपूर्ण हो जाता है। उदाहरण के लिए, यूनिक्स पुस्तकालय आमतौर पर पूरे सेकंड और डेटाबेस जैसे काम करते हैं पोस्टग्रेज माइक्रोसेकंड के लिए दिनांक-समय निर्धारित करते हैं।
- कुछ डेलाइट सेविंग टाइम परिवर्तन आधी रात को होते हैं जो आगे चलकर चीजों को भ्रमित कर सकते हैं।

Joda-Time 2.3 इस उद्देश्य के लिए एक विधि प्रदान करता है, दिन का पहला क्षण प्राप्त करने के लिए:withTimeAtStartOfDay() :। इसी तरह java.time में,LocalDate::atStartOfDay।
"Joda आधा खुला" के लिए StackOverflow खोजेंअधिक चर्चा और उदाहरण देखने के लिए ।
इस पोस्ट को देखें, , बिल श्नाइडर द्वारा टाइम अंतराल और अन्य रेंज आधी खुली होनी चाहिए ।
विरासत की तारीखों की कक्षाओं से बचें
Java.util.Date और। कैलेन्डर वर्ग कुख्यात हैं। इनसे बचें।
Java.time कक्षाओं का उपयोग करें । Java.time ढांचा बेहद सफल की आधिकारिक उत्तराधिकारी है Joda समय पुस्तकालय।
java.time
Java.time फ्रेमवर्क जावा 8 और बाद में बनाया गया है। थ्रीटेन-बैकपोर्ट प्रॉजेक्ट में जावा 6 और 7 के लिए बैक-पोर्ट किया गया, जो थ्रीटेनबप में एंड्रॉइड के लिए अनुकूल है। प्रोजेक्ट ।
एक Instantमें समय रेखा पर एक पल है यूटीसी के एक संकल्प के साथ नैनोसेकंड ।
Instant instant = Instant.now();
कुछ इलाके के लिए दीवार-घड़ी का समय प्राप्त करने के लिए एक समय क्षेत्र लागू करें ।
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
दिन का पहला क्षण प्राप्त करने के लिए LocalDateकक्षा और उसकी atStartOfDayविधि से गुजरें।
ZonedDateTime zdtStart = zdt.toLocalDate().atStartOfDay( zoneId );
हाफ-ओपन दृष्टिकोण का उपयोग करते हुए, अगले दिन का पहला क्षण प्राप्त करें।
ZonedDateTime zdtTomorrowStart = zdtStart.plusDays( 1 );

वर्तमान में java.time ढांचे में एक Intervalवर्ग का अभाव है जैसा कि नीचे दिए गए Joda-Time के लिए वर्णित है। हालाँकि, थ्रीटेन-एक्स्ट्रा प्रोजेक्ट अतिरिक्त कक्षाओं के साथ java.time का विस्तार करता है। यह परियोजना java.time के लिए भविष्य के संभावित परिवर्धन के लिए साबित होने वाला आधार है। इसकी कक्षाओं के बीच है Interval। वस्तुओं के Intervalएक जोड़े को पारित करके निर्माण Instant। हम Instantअपनी ZonedDateTimeवस्तुओं से अर्क निकाल सकते हैं।
Interval today = Interval.of( zdtStart.toInstant() , zdtTomorrowStart.toInstant() );
जावा के बारे में
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 कक्षाएं कहाँ से प्राप्त करें?
Joda समय
अद्यतन: जोडा-टाइम परियोजना अब रखरखाव-मोड में है, और माइग्रेशन को सलाह देती है java.time कक्षाओं में । मैं इस खंड को इतिहास के लिए बरकरार रख रहा हूं।
Joda समय विभिन्न तरीकों से समय की अवधि का प्रतिनिधित्व करने के तीन वर्गों है: Interval, Period, औरDuration । एक Intervalएक विशिष्ट शुरुआत और ब्रह्मांड के समय को समाप्त होने वाले हैं। यह "एक दिन" का प्रतिनिधित्व करने की हमारी आवश्यकता पर फिट बैठता है।
हम विधि कहते हैं withTimeAtStartOfDay दिन के समय को शून्य करने के बजाय हैं। डेलाइट सेविंग टाइम और अन्य विसंगतियों के कारण दिन का पहला क्षण नहीं हो सकता है 00:00:00।
उदाहरण कोड जोडा-टाइम 2.3 का उपयोग करना।
DateTimeZone timeZone = DateTimeZone.forID( "America/Montreal" );
DateTime now = DateTime.now( timeZone );
DateTime todayStart = now.withTimeAtStartOfDay();
DateTime tomorrowStart = now.plusDays( 1 ).withTimeAtStartOfDay();
Interval today = new Interval( todayStart, tomorrowStart );
यदि आपको चाहिए, तो आप एक java.util में बदल सकते हैं।
java.util.Date date = todayStart.toDate();