العمل مع التواريخ في Java: نظرة على المكتبات والأدوات الحديثة
العمل مع التواريخ والوقت هو أحد أكثر المهام شيوعًا في التطوير بلغة Java. لفترة طويلة، كانت الفئات القياسية java.util.Date و java.util.Calendar غير مريحة، قابلة للتغيير (mutable) وعرضة للأخطاء. لحسن الحظ، تغير الوضع. في هذه النظرة، سنستعرض ثلاثة مناهج رئيسية: الحزمة المدمجة java.time، مكتبة Joda-Time، وأدوات Apache Commons Lang.
1. java.time (Java 8+) — المعيار الحديث
بدءًا من Java 8، تم تضمين الحزمة java.time في المكتبة القياسية، وهي مستندة إلى أفكار Joda-Time. هذه هي الطريقة الأساسية والموصى بها للعمل مع التواريخ في المشاريع الجديدة.
الفئات الرئيسية:
LocalDate— تاريخ بدون وقت (سنة، شهر، يوم).LocalTime— وقت بدون تاريخ (ساعات، دقائق، ثوانٍ، نانو ثانية).LocalDateTime— دمج التاريخ والوقت.ZonedDateTime— التاريخ والوقت مع مراعاة المنطقة الزمنية.Instant— لحظة زمنية في UTC (قابلة للقراءة آليًا).DurationوPeriod— للعمل مع الفترات الزمنية.
أمثلة على الاستخدام:
import java.time.*;import java.time.format.DateTimeFormatter;import java.time.temporal.ChronoUnit;
public class JavaTimeExample { public static void main(String[] args) { // التاريخ والوقت الحاليين LocalDate today = LocalDate.now(); LocalTime now = LocalTime.now(); System.out.println("اليوم: " + today); System.out.println("الآن: " + now);
// إنشاء تاريخ محدد LocalDate birthDate = LocalDate.of(1990, Month.MAY, 15); System.out.println("تاريخ الميلاد: " + birthDate);
// العمل مع المناطق الزمنية ZonedDateTime berlinTime = ZonedDateTime.now(ZoneId.of("Europe/Berlin")); ZonedDateTime tokyoTime = ZonedDateTime.now(ZoneId.of("Asia/Tokyo")); System.out.println("في برلين: " + berlinTime); System.out.println("في طوكيو: " + tokyoTime);
// الفرق بين التواريخ long daysBetween = ChronoUnit.DAYS.between(birthDate, today); System.out.println("عدد الأيام منذ تاريخ الميلاد: " + daysBetween);
// التنسيق DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm"); String formatted = LocalDateTime.now().format(formatter); System.out.println("بعد التنسيق: " + formatted);
// تحليل سلسلة نصية LocalDate parsedDate = LocalDate.parse("2023-12-31"); System.out.println("بعد التحليل: " + parsedDate); }}2. Joda-Time — بديل مثبت عبر الزمن
قبل إصدار Java 8، كانت Joda-Time هي المعيار الفعلي للعمل مع التواريخ. الآن، استخدامها مبرر فقط في المشاريع القديمة (legacy) أو عند الحاجة لدعم إصدارات Java القديمة (أقل من 8).
الميزات الرئيسية:
- كائنات غير قابلة للتغيير (immutable) — أمان في تعدد الخيوط.
- دعم أنظمة تقويم متعددة (إسلامي، بوذي، وغيرها).
- واجهة برمجة تطبيقات (API) بسيطة وبديهية.
مثال على الكود باستخدام Joda-Time:
import org.joda.time.*;import org.joda.time.format.DateTimeFormat;import org.joda.time.format.DateTimeFormatter;
public class JodaTimeExample { public static void main(String[] args) { // التاريخ والوقت الحاليين DateTime now = DateTime.now(); System.out.println("الآن: " + now);
// إنشاء تاريخ DateTime specificDate = new DateTime(2020, 6, 15, 10, 30, 0); System.out.println("تاريخ محدد: " + specificDate);
// إضافة أيام DateTime nextW