आधुनिक उत्तर और अवलोकन
क) जावा -8 (जावा-टाइम-पैकेज)
LocalDate start = LocalDate.of(1996, 2, 29);
LocalDate end = LocalDate.of(2014, 2, 28); // use for age-calculation: LocalDate.now()
long years = ChronoUnit.YEARS.between(start, end);
System.out.println(years); // 17
ध्यान दें कि अभिव्यक्ति LocalDate.now()
स्पष्ट रूप से सिस्टम टाइमज़ोन (जो अक्सर उपयोगकर्ताओं द्वारा अनदेखी की जाती है) से संबंधित है। स्पष्टता के लिए now(ZoneId.of("Europe/Paris"))
एक स्पष्ट समयक्षेत्र (उदाहरण के लिए यहां "यूरोप / पेरिस") निर्दिष्ट करते हुए ओवरलोड विधि का उपयोग करना बेहतर है । यदि सिस्टम टाइमज़ोन का अनुरोध किया जाता है, तो मेरी व्यक्तिगत प्राथमिकता LocalDate.now(ZoneId.systemDefault())
सिस्टम टाइमज़ोन के संबंध को स्पष्ट करने के लिए लिखना है। यह लेखन का अधिक प्रयास है लेकिन पढ़ना आसान बनाता है।
b) जोडा-टाइम
कृपया ध्यान दें कि प्रस्तावित और स्वीकृत जोडा-टाइम-सॉल्यूशन उपरोक्त तिथियों (एक दुर्लभ मामला) के लिए एक अलग संगणना परिणाम देता है, अर्थात्:
LocalDate birthdate = new LocalDate(1996, 2, 29);
LocalDate now = new LocalDate(2014, 2, 28); // test, in real world without args
Years age = Years.yearsBetween(birthdate, now);
System.out.println(age.getYears()); // 18
मैं इसे एक छोटी बग के रूप में मानता हूं लेकिन इस अजीब व्यवहार पर जोडा-टीम का एक अलग दृष्टिकोण है और इसे ठीक नहीं करना चाहते हैं (अजीब है क्योंकि अंतिम तिथि का दिन महीने की शुरुआत की तारीख से छोटा है इसलिए वर्ष होना चाहिए एक कम)। इस बंद मुद्दे को भी देखें ।
c) java.util.Calendar आदि।
तुलना के लिए विभिन्न अन्य उत्तर देखें। मैं इन पुरानी कक्षाओं का उपयोग करने की सिफारिश नहीं करूंगा क्योंकि परिणामी कोड अभी भी कुछ विदेशी मामलों में त्रुटिपूर्ण है और / या इस तरह से इस तथ्य को देखते हुए भी जटिल है कि मूल प्रश्न इतना सरल लगता है। वर्ष 2015 में हमारे पास वास्तव में बेहतर पुस्तकालय हैं।
d) Date4J के बारे में:
प्रस्तावित समाधान सरल है, लेकिन कभी-कभी लीप वर्षों के मामले में विफल हो जाएगा। बस साल के दिन का मूल्यांकन विश्वसनीय नहीं है।
ई) मेरी अपनी लाइब्रेरी Time4J :
यह Java-8-solution के समान काम करता है। बस LocalDate
द्वारा PlainDate
और ChronoUnit.YEARS
द्वारा प्रतिस्थापित CalendarUnit.YEARS
। हालांकि, "आज" प्राप्त करने के लिए एक स्पष्ट समयक्षेत्र संदर्भ की आवश्यकता होती है।
PlainDate start = PlainDate.of(1996, 2, 29);
PlainDate end = PlainDate.of(2014, 2, 28);
// use for age-calculation (today):
// => end = SystemClock.inZonalView(EUROPE.PARIS).today();
// or in system timezone: end = SystemClock.inLocalView().today();
long years = CalendarUnit.YEARS.between(start, end);
System.out.println(years); // 17