العمل المتقدم مع التواريخ والوقت في Java: من LocalDate إلى المعالجات المعقدة
في Java الحديثة (بدءًا من الإصدار 8)، المعيار الفعلي للعمل مع التواريخ والوقت هو الحزمة java.time. لقد حلت محل java.util.Date و java.util.Calendar القديمتين، حيث تقدم كائنات غير قابلة للتغيير (immutable)، وأمانًا للخيوط، وAPI بديهي. في هذه المقالة، سنشرح التقنيات المتقدمة: العمل مع المناطق الزمنية، والحسابات الدقيقة للفروق، والمعدلات المخصصة، والتنسيق المعقد.
1. معالجة التواريخ باستخدام TemporalAdjusters
واحدة من أقوى ميزات java.time هي الواجهة TemporalAdjuster. تسمح بإجراء تعديلات معقدة على التواريخ - على سبيل المثال، العثور على "الثلاثاء التالي" أو "آخر يوم في الشهر".
تحتوي الفئة TemporalAdjusters (لاحظ صيغة الجمع) على طرق ثابتة جاهزة:
firstDayOfMonth()- أول يوم في الشهر؛lastDayOfMonth()- آخر يوم في الشهر؛next(DayOfWeek.FRIDAY)- اليوم التالي المحدد من الأسبوع؛previousOrSame(DayOfWeek.MONDAY)- الاثنين السابق أو الحالي.
مثال: لنجد تاريخ الأربعاء التالي بعد 15 مارس 2024.
import java.time.LocalDate;import java.time.DayOfWeek;import java.time.temporal.TemporalAdjusters;
public class TemporalExample { public static void main(String[] args) { LocalDate date = LocalDate.of(2024, 3, 15); LocalDate nextWednesday = date.with(TemporalAdjusters.next(DayOfWeek.WEDNESDAY)); System.out.println("الأربعاء التالي: " + nextWednesday); // الإخراج: 2024-03-20 }}يمكنك أيضًا إنشاء معدلاتك الخاصة عن طريق تنفيذ الواجهة الوظيفية TemporalAdjuster. هذا مفيد بشكل خاص لمنطق الأعمال: "أول يوم عمل في الشهر" أو "آخر جمعة في الربع".
2. العمل مع المناطق الزمنية و ZonedDateTime
يجب أن تأخذ التطبيقات العالمية في الاعتبار المناطق الزمنية. تجمع الفئة ZonedDateTime بين التاريخ والوقت والمنطقة (ZoneId).
مثال: تحويل الوقت من نيويورك إلى برلين مع مراعاة التوقيت الصيفي/الشتوي.
import java.time.ZonedDateTime;import java.time.ZoneId;import java.time.format.DateTimeFormatter;
public class ZoneExample { public static void main(String[] args) { ZonedDateTime newYork = ZonedDateTime.now(ZoneId.of("America/New_York")); ZonedDateTime berlin = newYork.withZoneSameInstant(ZoneId.of("Europe/Berlin"));
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm z"); System.out.println("نيويورك: " + newYork.format(formatter)); System.out.println("برلين: " + berlin.format(formatter)); }}هام: للحصول على جميع المناطق المتاحة، استخدم ZoneId.getAvailableZoneIds(). تجنب الاختصارات المكونة من ثلاثة أحرف (EST، PST) - فهي غامضة. استخدم دائمًا تنسيق continent/city (على سبيل المثال، Asia/Tokyo).
3. الحسابات الدقيقة للفروق: ChronoUnit و Duration
لحساب الفرق بين التواريخ في Java، هناك طريقتان:
ChronoUnit- للفرق بالوحدات التقويمية (أيام، أشهر، سنوات)؛Duration- للفترات الزمنية الدقيقة (ثوانٍ، نانوثانية).
مثال: كم يومًا وشهرًا متبقيًا حتى رأس السنة الجديدة؟
import java.time.LocalDate;import java.time.temporal.ChronoUnit;
public class DiffExample { public static void main(String[] args) { LocalDate today = LocalDate.now(); LocalDate newYear = LocalDate.of(today.getYear() + 1, 1, 1);
long days = ChronoUnit.DAYS.between(today, new