java - गणन - नंदा तिथि




जोडा-टाइम में दो तिथियों के बीच दिनों की संख्या (4)

मैं दो Joda-Time DateTime उदाहरणों के बीच दिनों में अंतर कैसे प्राप्त करूं? 'दिनों में अंतर' के साथ मेरा मतलब है कि अगर सोमवार को शुरू होता है और अंत मंगलवार को होता है तो मुझे शुरुआत और समाप्ति तिथियों के घंटे / मिनट / सेकंड के बावजूद 1 का रिटर्न वैल्यू होने की उम्मीद है।

Days.daysBetween(start, end).getDays() अगर शाम को शुरू होता है और सुबह में समाप्त होता है तो मुझे 0 देता है।

मुझे अन्य तारीख क्षेत्रों के साथ भी एक ही समस्या है इसलिए मैं उम्मीद कर रहा था कि कम महत्व वाले क्षेत्रों को 'अनदेखा' करने का एक सामान्य तरीका होगा।

दूसरे शब्दों में, फरवरी और 4 मार्च के बीच के महीनों में भी 1 होगा, जैसा कि 14:45 और 15:12 के बीच के घंटे होंगे। हालांकि 14:01 और 14:55 के बीच का अंतर 0 होगा।


tl; डॉ

java.time.temporal.ChronoUnit.DAYS.between( 
    earlier.truncatedTo( ChronoUnit.DAYS )  , 
    later.truncatedTo( ChronoUnit.DAYS ) 
)

... या ...

java.time.temporal.ChronoUnit.HOURS.between( 
    earlier.truncatedTo( ChronoUnit.HOURS )  , 
    later.truncatedTo( ChronoUnit.HOURS ) 
)

java.time

एफवाईआई, Joda-Time प्रोजेक्ट अब रखरखाव मोड में है , टीम ने java.time कक्षाओं में माइग्रेशन की सलाह दी है।

जोडा-टाइम DateTime के ZonedDateTime

ZoneId z = ZoneId.of( "Pacific/Auckland" ) ;
ZonedDateTime now = ZonedDateTime.now( z ) ;

जाहिर है आप तारीखों के आधार पर गिनना चाहते हैं, जिसका अर्थ है कि आप दिन के समय को अनदेखा करना चाहते हैं। उदाहरण के लिए, आधी रात से एक मिनट पहले और आधी रात के बाद एक मिनट समाप्त होने के परिणामस्वरूप एक दिन का परिणाम होना चाहिए। इस व्यवहार के लिए, अपने ZonedDateTime से ZonedDateTimeLocalDate क्लास समय-समय पर और समय क्षेत्र के बिना दिनांक-केवल मूल्य का प्रतिनिधित्व करता है।

LocalDate localDateStart = zdtStart.toLocalDate() ;
LocalDate localDateStop = zdtStop.toLocalDate() ;

ChronoUnit दिन या अन्य इकाइयों की गणना करने के लिए ChronoUnit enum का उपयोग करें।

long days = ChronoUnit.DAYS.between( localDateStart , localDateStop ) ;

काटें

जैसा कि आप इस गिनती को करने के लिए एक और सामान्य तरीका पूछ रहे हैं, जहां आप घंटों के डेल्टा में घंटों के रूप में घंटे के रूप में घंटे के रूप में रुचि रखते हैं, साठ मिनट के स्पैन-ऑफ-टाइम के रूप में, truncatedTo विधि का उपयोग करें।

उसी दिन 14:45 से 15:12 का आपका उदाहरण यहां दिया गया है।

ZoneId z = ZoneId.of( "America/Montreal" ); 
ZonedDateTime start = ZonedDateTime.of( 2017 , 1 , 17 , 14 , 45 , 0 , 0 , z );
ZonedDateTime stop = ZonedDateTime.of( 2017 , 1 , 17 , 15 , 12 , 0 , 0 , z );

long hours = ChronoUnit.HOURS.between( start.truncatedTo( ChronoUnit.HOURS ) , stop.truncatedTo( ChronoUnit.HOURS ) );

1

तिथियों के दिनों की गिनती के लिए, ChronoUnit.DAYS को ChronoUnit.DAYS । यहां 1 मिनट के लिए पांच मिनट पहले पांच मिनट से मध्यरात्रि में रोलिंग का उदाहरण दिया गया है।

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime start = ZonedDateTime.of( 2017 , 1 , 17 , 23 , 55 , 0 , 0 , z );
ZonedDateTime stop = ZonedDateTime.of( 2017 , 1 , 18 , 00 , 05 , 0 , 0 , z );

long days = ChronoUnit.DAYS.between( start.truncatedTo( ChronoUnit.DAYS ) , stop.truncatedTo( ChronoUnit.DAYS ) );

1

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

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

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

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

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

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

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

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

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


Days कक्षा

withTimeAtStartOfDay विधि के साथ Days क्लास का उपयोग करना चाहिए:

Days.daysBetween(start.withTimeAtStartOfDay() , end.withTimeAtStartOfDay() ).getDays() 

कष्टप्रद, withTimeAtStartOfDay उत्तर गलत है, लेकिन कभी-कभी कभी-कभी। तुम्हें चाहिए:

Days.daysBetween(start.toLocalDate(), end.toLocalDate()).getDays()

यह पता चला है कि "मध्यरात्रि / दिन की शुरुआत" कभी-कभी 1am (कुछ स्थानों में डेलाइट बचत इस तरह होती है), जो Days.daysBweenween ठीक से संभाल नहीं करता है।

// 5am on the 20th to 1pm on the 21st, October 2013, Brazil
DateTimeZone BRAZIL = DateTimeZone.forID("America/Sao_Paulo");
DateTime start = new DateTime(2013, 10, 20, 5, 0, 0, BRAZIL);
DateTime end = new DateTime(2013, 10, 21, 13, 0, 0, BRAZIL);
System.out.println(daysBetween(start.withTimeAtStartOfDay(),
                               end.withTimeAtStartOfDay()).getDays());
// prints 0
System.out.println(daysBetween(start.toLocalDate(),
                               end.toLocalDate()).getDays());
// prints 1

एक LocalDate माध्यम से जाकर पूरे मुद्दे को LocalDate


स्वीकृत उत्तर दो LocalDate ऑब्जेक्ट्स बनाता है, जो बहुत अधिक महंगे हैं यदि आप बहुत सारे डेटा पढ़ रहे हैं। मैं इसका उपयोग करता हूं:

  public static int getDaysBetween(DateTime earlier, DateTime later)
  {
    return (int) TimeUnit.MILLISECONDS.toDays(later.getMillis()- earlier.getMillis());
  }

getMillis() कॉल करके आप पहले से ही मौजूदा चर का उपयोग करते हैं।
MILLISECONDS.toDays() फिर, एक सरल अंकगणितीय गणना का उपयोग करता है, कोई ऑब्जेक्ट नहीं बनाता है।







jodatime