العمل مع التواريخ في Java: نظرة على مكتبات java.time و Joda-Time و Apache Commons

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

العمل مع التواريخ في 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

توصيات