जावा 8: दो ZonedDateTime के बीच अंतर की गणना करें


80

मैं समय ज़ोन के बीच के अंतर के बारे में दो ज़ोनडेडेट समय के बीच अंतर को मुद्रित करने के लिए एक विधि लिखने की कोशिश कर रहा हूं ।

मुझे कुछ समाधान मिले, लेकिन उन सभी को LocalDateTime के साथ काम करने के लिए लिखा गया था ।


2
एक ठोस उदाहरण पोस्ट करें कि आप क्या हासिल करना चाहते हैं, और परिणामस्वरूप।
बजे जेबी निज़ेट

2
माइकेल का जवाब ठीक वही है जिसकी मुझे उम्मीद थी। आपका बहुत बहुत धन्यवाद!
मैगी हिल

जवाबों:


102

आप विधि का उपयोग कर सकते हैं के बीच से ChronoUnit

यह विधि उन समयों को उसी क्षेत्र (पहले तर्क से क्षेत्र) में परिवर्तित करती है और उसके बाद, टेम्पोरल इंटरफ़ेस में घोषित विधि तक आक्रमण करती है:

static long zonedDateTimeDifference(ZonedDateTime d1, ZonedDateTime d2, ChronoUnit unit){
    return unit.between(d1, d2);
}

चूंकि ZonedDateTime और LocalDateTime दोनों टेम्पोरल इंटरफ़ेस लागू करते हैं, आप उन दिनांक-प्रकारों के लिए सार्वभौमिक विधि भी लिख सकते हैं:

static long dateTimeDifference(Temporal d1, Temporal d2, ChronoUnit unit){
    return unit.between(d1, d2);
}

लेकिन ध्यान रखें, कि मिश्रित LocalDateTime और ZonedDateTime के लिए इस विधि को लागू करना DateTimeException की ओर जाता है ।

आशा है कि इससे सहायता मिलेगी।


क्या दो जेडडीटी प्रकारों के बीच अंतर प्राप्त करने का एक तरीका है जहां दो जेडडीटी के बीच जोनआईड अलग है?
stanlick

@stanlick Yes: Duration.between( zdtA , zdtB )जैसा कि मेरे उत्तर में दिखाया गया है । मुझे लगता है कि betweenविधि ZonedDateTime::toInstant()दोनों को बुला रही है।
बेसिल बोर्क

73

tl; डॉ

घंटे, मिनट, सेकंड के लिए:

Duration.between( zdtA , zdtB )  // Represent a span-of-time in terms of days (24-hour chunks of time, not calendar days), hours, minutes, seconds. Internally, a count of whole seconds plus a fractional second (nanoseconds).

वर्षों, महीनों, दिनों के लिए:

Period.between(                  // Represent a span-of-time in terms of years-months-days. 
    zdtA.toLocalDate() ,         // Extract the date-only from the date-time-zone object. 
    zdtB.toLocalDate() 
)

विवरण

मीकल एस द्वारा उत्तर दिखा रहा है, सही है ChronoUnit

Duration और Period

एक अन्य मार्ग वर्ग Durationऔर Periodवर्ग हैं। समय (घंटे, मिनट, सेकंड) के छोटे स्पैन के लिए पहले का उपयोग करें, दूसरा लंबे समय तक (वर्ष, महीने, दिन)।

Duration d = Duration.between( zdtA , zdtB );

कॉल करके मानक ISO 8601 प्रारूप में एक स्ट्रिंग का उत्पादन करें toString। प्रारूप वह है PnYnMnDTnHnMnSजहां Pशुरुआत को चिह्नित करता है और Tदो भागों को अलग करता है।

String output = d.toString();

जावा 9 और बाद में, to…Partव्यक्तिगत घटकों को प्राप्त करने के लिए तरीकों को कॉल करें । मेरे एक और उत्तर में चर्चा की गई ।

उदाहरण कोड

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdtStart = ZonedDateTime.now( z );
ZonedDateTime zdtStop = zdtStart.plusHours( 3 ).plusMinutes( 7 );

Duration d = Duration.between( zdtStart , zdtStop );

2016-12-11T03: 07: 50.639-05: 00 [अमेरिका / मॉन्ट्रियल] /2016-12-11T06:14:50.639-05:00 [अमेरिका / मॉन्ट्रियल]

PT3H7M

IdeOne.com में लाइव कोड देखें ।

Interval और LocalDateRange

ThreeTen-अतिरिक्त परियोजना java.time वर्गों के लिए कार्यक्षमता जोड़ता। इसकी एक उपयोगी कक्षा Intervalसमय रेखा पर एक जोड़ी बिंदु के रूप में समय की अवधि का प्रतिनिधित्व करना है। एक और LocalDateRange, LocalDateवस्तुओं की एक जोड़ी के लिए है। इसके विपरीत, Period& Durationवर्ग प्रत्येक समय की अवधि का प्रतिनिधित्व करते हैं जैसा कि समयरेखा से जुड़ा नहीं है

वस्तुओं Intervalकी एक जोड़ी के लिए कारखाना विधि Instant

Interval interval = Interval.of( zdtStart.toInstant() , zdtStop.toInstant() );

आप एक Durationसे प्राप्त कर सकते हैं Interval

Duration d = interval.toDuration();

जावा और थ्रीटैन-एक्स्ट्रा प्रोजेक्ट में स्पैन ऑफ टाइम क्लास


जावा के बारे में

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

Joda समय परियोजना, अब में रखरखाव मोड , प्रवास करने की सलाह देता java.time कक्षाएं।

अधिक जानने के लिए, Oracle ट्यूटोरियल देखें । और कई उदाहरणों और स्पष्टीकरणों के लिए ढेर अतिप्रवाह खोजें। विशिष्टता JSR 310 है

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

Java.time कक्षाएं कहाँ से प्राप्त करें?

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


आप ofअवधि पर एक विधि कहाँ देख रहे हैं जिसमें दो उदाहरण हैं? मैं केवल देखता हूंpublic static Duration of(long amount, TemporalUnit unit)
ब्रायन गॉर्डन

@BrianGordon फिक्स्ड, के .ofसाथ की जगह .between। धन्यवाद।
बेसिल बॉर्क

अवधि ZonedDateTime के साथ काम करता है इस बीच में LocalDate के साथ काम करता है। विधि toLocalDate () के लिए एक कॉल हमारे zdt वस्तु पर किया जाना चाहिए।
गिलोय ग्वारिन

1
@guillaumeguerin आप सही हैं। मेरा कोड उदाहरण तय किया। धन्यवाद।
तुलसी बॉर्क

ओह यार बहुत बहुत धन्यवाद, आपका उदाहरण इसका बहुत अच्छा है !!!!
ब्रेंडन इवाटा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.