تحتوي حزمة java.time التي أُدخلت في Java 8 على عدة أصناف للتعامل مع التواريخ والوقت.
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 الترميز القياسي ISO-8601 عند التحويل من String وإليه.
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 من String بهذه الطريقة باستخدام تنسيق مختلف.
بدلًا من ذلك، لتنسيق التواريخ باستخدام تنسيق مخصّص، ينبغي عليك استخدام 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"
يمكنك أيضًا تحديد الإعدادات المحلية عند إنشاء التنسيق المخصّص للتنسيق والتحليل لمناطق مختلفة:
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
في هذا التمرين ستعمل على مُجدوِل مواعيد لصالون تجميل في نيويورك افتُتح في 15 سبتمبر 2012.
نفّذ طريقة 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() التي تأخذ تاريخ موعد وتتحقق مما إذا كان الموعد في فترة ما بعد الظهر (>= 12:00 و < 18:00):
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() التي تُرجع تاريخ الذكرى السنوية لهذا العام، وهو 15 سبتمبر:
AppointmentScheduler scheduler = new AppointmentScheduler();
scheduler.getAnniversaryDate()
// => LocalDate.of(<current year>, 9, 15)
سجّل في Exercism لتتعلّم وتتقن Java عبر 26 مفهومًا158 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.