java मोटापा - जावा:तिथि घटाने का सबसे आसान तरीका




पेट आयुर्वेदिक (5)

पदच्छेद

पहले आपको अपने स्ट्रिंग आदानों को तिथि-समय की वस्तुओं में पार्स करना होगा। फिर आप उन वस्तुओं के साथ अपने व्यावसायिक तर्क को प्राथमिकता देते हैं।

दिनांक के समय मानों को स्ट्रिंग्स के रूप में सोचने से रोकें, जो आपको पागल कर देगा। हम अपने कोड में डेट-टाइम ऑब्जेक्ट्स के साथ काम करते हैं; हम उस तिथि-समय ऑब्जेक्ट के स्ट्रिंग प्रस्तुति का उपयोग करते हुए उपयोगकर्ताओं या अन्य ऐप्स के साथ डेटा विनिमय करते हैं

जावा 8 और बाद में, जावा। टाइम फ्रेमवर्क का उपयोग करें। ट्यूटोरियल देखें

आप केवल एक तारीख चाहते हैं, दिन के बिना, इसलिए हम स्थानीय LocalDate क्लास का उपयोग कर सकते हैं।

यह कायरता डबल-बृहदान्त्र वाक्यविन्यास एक विधि संदर्भ है , यह कहने का एक तरीका है कि अन्य कोड द्वारा किस पद्धति को कॉल किया जाना चाहिए।

String input = "2015 01 02";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "yyyy MM dd" );
LocalDate localDate = formatter.parse ( input , LocalDate :: from );

घटाए गए तिथियां

StackOveflow.com पर कई बार इसे संबोधित किया गया है उदाहरण के लिए, जावा कैलेंडर का उपयोग करते हुए दिनांक से एक्स दिन कैसे घटाना है? । विवरण के लिए, अन्य उत्तर देखें जैसे कि यह मेरे द्वारा और यह अधिक जानकारी के लिए मेरे द्वारा । युक्ति: "समाप्त" एक प्रमुख खोज शब्द है

संक्षेप में, कई मानक दिनों, महीनों और वर्षों को परिभाषित करने के लिए एक Period का उपयोग करें।

LocalDate weekLater = localDate.plusDays ( 7 );
Period period = Period.between ( localDate , weekLater );
Integer daysElapsed = period.getDays ();

डंप करने के लिए कंसोल

System.out.println ( "localDate: " + localDate + " to " + weekLater + " in days: " + daysElapsed );

स्थानीय दिनांक: 2015-01-02 से 2015-01-09 दिनों में: 7

ध्यान दें कि Period पूरे दिन के साथ ही काम करती है, वह है, समय-प्रतिदिन के बिना केवल-तिथि मान इस प्रश्न के लिए हमें यहां वही जरूरत है, इसलिए काम किया। यदि आपके पास दिनांक-समय के मान ( ZonedDateTime ऑब्जेक्ट्स) थे, तो लिंक से जुड़े प्रश्न / उत्तर में ऊपर दिए गए तीन-अतिरिक्त- परियोजना के Days वर्ग का उपयोग करें।

मैंने दो फ़ील्ड के साथ एक क्लास बनाया है जो कि तिथियां, start_date और date_passed । मैं जावा में सबसे अच्छे तरीके से एक YYYY MM DD प्रारूप में तारीखों पर शोध कर रहा हूं जो कि आसान तिथि घटाव के लिए अनुमति देता है, और एक तिथि "मेकअप" करने की क्षमता, उदाहरण के लिए भविष्य में कहते हैं।

मैं क्या करना चाहूँगा का उदाहरण ...

library.circulate_book("Chemistry", **start date here**) //actual date or random date
library.pass_book("Chemistry", **Date Passed here**) //random date such as 5 days after start date
int days_had = Date_Passed - start_date

अब तक, मुझे कैलेंडर और दिनांक कक्षाओं का उपयोग करते हुए तारीखों को प्रारूपित करने के लिए बहुत सारे तरीके मिल गए हैं, लेकिन अभी तक ऐसा कोई ऐसा ढूंढना नहीं है जो ऐसा लगता है कि यह अधिकांश तिथियों को स्ट्रिंग्स के रूप में समाप्त करने के लिए काम करेगा। कोई सुझाव / छोटे उदाहरण काफी सराहना कर रहे हैं! साथ ही, उदाहरणों के लिए कोई भी लिंक कमाल का होगा!


जावा -8 में ऐसा करने का सबसे अच्छा तरीका तुलसी Bourque का दोषपूर्ण जवाब नहीं है, लेकिन यह दृष्टिकोण:

String startDate = "2016 01 02";
String passedDate = "2016 02 29";

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy MM dd");
LocalDate date1 = LocalDate.parse(startDate, formatter);
LocalDate date2 = LocalDate.parse(passedDate, formatter);

long elapsedDays = ChronoUnit.DAYS.between(date1, date2);
System.out.println(elapsedDays); // 58 (correct)

java.time.Period.getDays() का सुझाया उपयोग खतरनाक और अक्सर गलत है जैसे ही बीत गए अवधि एक माह से अधिक हो। संपूर्ण Period P1M27D है, इसलिए यह कोड प्रभावी रूप से केवल बीते दिनों की आंशिक राशि (एक बीता हुआ माह भी है) से पूछता है:

System.out.println(Period.between(date1, date2).getDays()); // 27 (WRONG!!!)

कक्षाओं का उपयोग करते हुए एक संतोषजनक समाधान java.util.Date , GregorianCalendar इत्यादि। आप टेकेथराइट्रिक्स के जवाब का उपयोग कर सकते हैं, लेकिन इस तथ्य से अवगत होना चाहिए कि बीते दिनों की गणना की गणना java.util.Date के उप-भाग-भागों के कारण भिन्न हो सकती है और दिन-रोशनी- बचत स्विच (जहां घड़ी दुनिया के कई हिस्सों में एक घंटे से कूदता है)।

साइड नोट: कम से कम 8 बाहरी पुस्तकालय आपकी समस्या के अच्छे उत्तर भी देते हैं। लेकिन मुझे लगता है कि आपका सरल उपयोग-केस अतिरिक्त पुस्तकालय के एम्बेडिंग को सही नहीं करता है, जब तक आप अभी तक जावा -8 पर नहीं हैं कोई भी वैकल्पिक समाधान दो तिथियों के बीच बीत गए दिनों को कैसे गिनने के लिए जावा -8 की तुलना में आसान नहीं होगा - केवल इसी तरह की। और जब से तुलसी बार्के के जावा -8-संबंधित उत्तर स्वीकार किए जाते हैं, तो मैं मानता हूं कि आप वाकई जावा -8 पर हैं इसलिए मैंने जवाब दिया कि आपकी समस्या को अन्य पुस्तकालयों के साथ कैसे हल किया जाए।


Calendar का उपयोग करते हुए यहां एक उत्तर दिया गया है:

Calendar cal = Calendar.getInstance();
Calendar cal2 = Calendar.getInstance();

cal2.setTime(cal.getTime());
cal2.add(Calendar.DAY_OF_YEAR, 5);
System.out.println((cal2.getTimeInMillis() - cal.getTimeInMillis()) / (1000d * 60 * 60 * 24));


जैसा कि दूसरों द्वारा समझाया गया है, वहां एक समय विघटन होता है। Asia/Shanghai 1927-12-31 23:54:08 लिए दो संभावित 1927-12-31 23:54:08 ऑफ़सेट हैं, लेकिन 1 1927-12-31 23:54:07 लिए केवल एक ऑफसेट है। तो, किस ऑफसेट का उपयोग किया जाता है, इस पर निर्भर करता है कि या तो एक दूसरा अंतर या 5 मिनट और 53 सेकंड का अंतर होता है।

सामान्य एक घंटे की डेलाइट बचत (ग्रीष्मकालीन समय) के बजाय ऑफ़सेट की यह मामूली बदलाव, हम समस्या का थोड़ा सा अस्पष्ट उपयोग करते हैं।

ध्यान दें कि टाइमज़ोन डेटाबेस के 2013a अद्यतन ने कुछ सेकंड पहले इस विघटन को स्थानांतरित कर दिया था, लेकिन प्रभाव अभी भी देखा जा सकता है।

जावा 8 पर नया java.time पैकेज इसे और अधिक स्पष्ट रूप से देखने दें, और इसे संभालने के लिए टूल प्रदान करें। दिया हुआ:

DateTimeFormatterBuilder dtfb = new DateTimeFormatterBuilder();
dtfb.append(DateTimeFormatter.ISO_LOCAL_DATE);
dtfb.appendLiteral(' ');
dtfb.append(DateTimeFormatter.ISO_LOCAL_TIME);
DateTimeFormatter dtf = dtfb.toFormatter();
ZoneId shanghai = ZoneId.of("Asia/Shanghai");

String str3 = "1927-12-31 23:54:07";  
String str4 = "1927-12-31 23:54:08";  

ZonedDateTime zdt3 = LocalDateTime.parse(str3, dtf).atZone(shanghai);
ZonedDateTime zdt4 = LocalDateTime.parse(str4, dtf).atZone(shanghai);

Duration durationAtEarlierOffset = Duration.between(zdt3.withEarlierOffsetAtOverlap(), zdt4.withEarlierOffsetAtOverlap());

Duration durationAtLaterOffset = Duration.between(zdt3.withLaterOffsetAtOverlap(), zdt4.withLaterOffsetAtOverlap());

फिर durationAtEarlierOffset एक सेकंड होगी, जबकि durationAtLaterOffset पांच मिनट और 53 सेकंड होगा।

इसके अलावा, ये दो ऑफसेट समान हैं:

// Both have offsets +08:05:52
ZoneOffset zo3Earlier = zdt3.withEarlierOffsetAtOverlap().getOffset();
ZoneOffset zo3Later = zdt3.withLaterOffsetAtOverlap().getOffset();

लेकिन ये दोनों अलग हैं:

// +08:05:52
ZoneOffset zo4Earlier = zdt4.withEarlierOffsetAtOverlap().getOffset();

// +08:00
ZoneOffset zo4Later = zdt4.withLaterOffsetAtOverlap().getOffset();

आप 1 1927-12-31 23:59:59 तुलना में 1 1927-12-31 23:59:59 तुलना में एक ही समस्या देख सकते हैं, हालांकि, इस मामले में, यह पहले ऑफसेट है जो लंबे विचलन का उत्पादन करता है, और यह है पहले की तारीख जिसमें दो संभावित ऑफसेट हैं।

इस तक पहुंचने का एक और तरीका यह जांचना है कि कोई संक्रमण चल रहा है या नहीं। हम ऐसा कर सकते हैं:

// Null
ZoneOffsetTransition zot3 = shanghai.getRules().getTransition(ld3.toLocalDateTime);

// An overlap transition
ZoneOffsetTransition zot4 = shanghai.getRules().getTransition(ld3.toLocalDateTime);

आप जांच सकते हैं कि संक्रमण एक ओवरलैप है - इस मामले में उस दिनांक / समय के लिए एक से अधिक वैध ऑफसेट हैं - या एक अंतर - जिस स्थिति में दिनांक / समय उस क्षेत्र आईडी के लिए मान्य नहीं है - isOverlap() का उपयोग करके और isGap() पर isGap() विधियों।

मुझे उम्मीद है कि जावा 8 व्यापक रूप से उपलब्ध होने के बाद या जेएसआर 310 बैकपोर्ट को अपनाने वाले जावा 7 का उपयोग करने वाले लोगों के लिए इस तरह के मुद्दे को संभालने में लोगों की मदद करता है।





java date datepicker calendar subtract