بستهی java.time که در Java ۸ معرفی شد، شامل چندین کلاس برای کار با تاریخ و زمان است.
LocalDateکلاس java.time.LocalDate تاریخی را بدون منطقهی زمانی در سیستم تقویم ISO-8601 نمایش میدهد، مانند 2007-12-03:
LocalDate date = LocalDate.of(2007, 12, 3);
تاریخها را میتوان با تاریخهای دیگر مقایسه کرد:
LocalDate date1 = LocalDate.of(2007, 12, 3);
LocalDate date2 = LocalDate.of(2007, 12, 4);
date1.isBefore(date2);
// => true
date1.isAfter(date2);
// => false
یک نمونهی LocalDate متدهای گیرندهای دارد که بخشهای زمانی را از آن بازیابی میکنند:
LocalDate date = LocalDate.of(2007, 12, 3);
date.getDayOfMonth();
// => 3
یک نمونهی LocalDate متدهایی برای افزودن یکاهای زمان به آن دارد:
این متدها یک نمونهی جدید LocalDate برمیگردانند و نمونهی موجود را بهروزرسانی نمیکنند، چون کلاس LocalDate تغییرناپذیر است.
LocalDate date = LocalDate.of(2007, 12, 3);
date.plusDays(3);
// => 2007-12-06
LocalDateTimeکلاس java.time.LocalDateTime تاریخ و زمانی را بدون منطقهی زمانی در سیستم تقویم ISO-8601 نمایش میدهد، مانند 2007-12-03T10:15:30:
LocalDateTime datetime = LocalDateTime.of(2007, 12, 3, 10, 15, 30);
میتوانید یک نمونهی LocalDate را به LocalDateTime تبدیل کنید:
LocalDate date = LocalDate.of(2007, 12, 3);
LocalDateTime datetime = date.atTime(10, 15, 30);
datetime.toString();
// => "2007-12-03T10:15:30"
هر دو کلاس LocalDate و LocalDateTime هنگام تبدیل از String و به آن، از نشانهگذاری استاندارد ISO-8601 استفاده میکنند.
LocalDateTime datetime = LocalDateTime.of(2007, 12, 3, 10, 15, 30);
LocalDateTime parsed = LocalDateTime.parse("2007-12-03T10:15:30");
datetime.isEqual(parsed);
// => true
نمیتوان LocalDate یا LocalDateTime را با قالب متفاوتی از رشتهای مانند این تجزیه کرد.
در عوض، برای قالببندی تاریخها با یک قالب سفارشی، باید از java.time.format.DateTimeFormatter استفاده کنید:
DateTimeFormatter parser = DateTimeFormatter.ofPattern("dd/MM/yyyy");
LocalDate date = LocalDate.parse("03/12/2007", parser);
DateTimeFormatter printer = DateTimeFormatter.ofPattern("MMMM d, yyyy");
printer.format(date);
// => "December 3, 2007"
هنگام ساختن قالب سفارشی میتوان یک locale را نیز مشخص کرد تا قالببندی و تجزیه برای مناطق مختلف انجام شود:
DateTimeFormatter.ofPattern("MMMM d, yyyy", Locale.FRENCH).format(date);
// => décembre 3, 2007
DateTimeFormatter.ofPattern("MMMM d, yyyy", Locale.of("pt")).format(date);
// => dezembro 3, 2007
در این تمرین روی یک برنامهریز قرار ملاقات برای یک سالن زیبایی در نیویورک کار میکنید که در ۱۵ سپتامبر ۲۰۱۲ افتتاح شد.
متد AppointmentScheduler.schedule() را پیادهسازی کنید تا یک نمایش متنی از تاریخ قرار ملاقات را به LocalDateTime متناظر تبدیل کند:
AppointmentScheduler scheduler = new AppointmentScheduler();
scheduler.schedule("7/25/2019 13:45:00");
// => LocalDateTime.of(2019, 7, 25, 13, 45, 0)
متد AppointmentScheduler.hasPassed() را پیادهسازی کنید که یک تاریخ قرار ملاقات میگیرد و بررسی میکند آیا این قرار ملاقات در گذشته بوده است یا نه:
AppointmentScheduler scheduler = new AppointmentScheduler();
scheduler.hasPassed(LocalDateTime.of(1999, 12, 31, 9, 0, 0));
// => true
متد AppointmentScheduler.isAfternoonAppointment() را پیادهسازی کنید که یک تاریخ قرار ملاقات میگیرد و بررسی میکند آیا این قرار ملاقات در بعدازظهر است (>= ۱۲:۰۰ و < ۱۸:۰۰):
AppointmentScheduler scheduler = new AppointmentScheduler();
scheduler.isAfternoonAppointment(LocalDateTime.of(2019, 03, 29, 15, 0, 0))
// => true
متد AppointmentScheduler.getDescription() را پیادهسازی کنید که یک تاریخ قرار ملاقات میگیرد و توصیفی از آن تاریخ و زمان را برمیگرداند:
AppointmentScheduler scheduler = new AppointmentScheduler();
scheduler.getDescription(LocalDateTime.of(2019, 03, 29, 15, 0, 0))
// => "You have an appointment on Friday, March 29, 2019, at 3:00 PM."
متد AppointmentScheduler.getAnniversaryDate() را پیادهسازی کنید که تاریخ سالگرد امسال را برمیگرداند؛ این تاریخ ۱۵ سپتامبر است:
AppointmentScheduler scheduler = new AppointmentScheduler();
scheduler.getAnniversaryDate()
// => LocalDate.of(<current year>, 9, 15)