আধুনিক উত্তর এবং ওভারভিউ
ক) জাভা -৮ (জাভা.টাইম-প্যাকেজ)
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())
সিস্টেমের টাইমজোনকে আরও পরিষ্কার করার জন্য লিখতে হয়। এটি আরও লেখার প্রচেষ্টা তবে পড়া সহজ করে তোলে।
খ) জোদা-সময়
দয়া করে নোট করুন যে প্রস্তাবিত এবং গৃহীত জোদা-সময়-সমাধান উপরোক্ত তারিখগুলির জন্য পৃথক গণনার ফলাফল দেয় (বিরল ক্ষেত্রে), যথা:
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.Clavender ইত্যাদি
তুলনা করার জন্য অন্যান্য অন্যান্য উত্তর দেখুন। আমি এই পুরানো ক্লাসগুলি মোটেও ব্যবহার করার পরামর্শ দেব না কারণ ফলাফলটি কোডটি এখনও কিছু বহিরাগত ক্ষেত্রে এবং / অথবা মূল প্রশ্নটি এত সহজ বলে মনে হচ্ছে যে খুব জটিলভাবে ত্রুটিযুক্ত। ২০১৫ সালে আমাদের কাছে আরও ভাল গ্রন্থাগার রয়েছে।
d) তারিখ 4 জে সম্পর্কে:
প্রস্তাবিত সমাধানটি সহজ তবে লিপ বছরের ক্ষেত্রে কখনও কখনও ব্যর্থ হয়। কেবল বছরের দিনের মূল্যায়ন নির্ভরযোগ্য নয়।
e) আমার নিজস্ব লাইব্রেরি টাইম 4 জ :
এটি জাভা -8-সলিউশনের অনুরূপ কাজ করে। শুধু 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