العمل مع التواريخ والوقت في Java: دليل شامل

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

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

ابدأ الدورة

مقدمة في التعامل مع التواريخ والوقت في Java

التعامل مع التواريخ والوقت هو أحد أكثر المهام شيوعًا في التطوير. سواء كان تسجيل الأحداث، حساب المواعيد النهائية، تصفية البيانات، أو عرض التقويم - لا يمكن الاستغناء عن الإتقان الجيد لواجهات برمجة التطبيقات الزمنية. في Java، تم استخدام الفئات java.util.Date و java.util.Calendar لفترة طويلة، لكنها كانت تعاني من العديد من العيوب: القابلية للتغيير، واجهة برمجة تطبيقات غير بديهية، ومشاكل مع تعدد الخيوط.

بدءًا من Java 8، تمت إضافة حزمة جديدة java.time إلى اللغة، والتي تعتمد على معيار ISO-8601. وهي تقدم فئات غير قابلة للتغيير (immutable) وآمنة للخيوط (thread-safe)، والتي تكون أكثر ملاءمة للاستخدام. في هذه المقالة، سنستعرض كلاً من الأساليب القديمة والجديدة، وسنقدم أمثلة عملية على الكود.



1. الفئات القديمة: Date و Calendar

على الرغم من أن استخدام Date و Calendar غير موصى به في المشاريع الجديدة، إلا أنه قد تصادفها في الكود القديم (legacy code). دعنا نستعرض النقاط الرئيسية.



الفئة java.util.Date

الفئة Date تمثل لحظة زمنية محددة بدقة تصل إلى الميلي ثانية. تحتوي على العديد من الطرق القديمة.

import java.util.Date;

public class DateExample { public static void main(String[] args) { // التاريخ والوقت الحاليين Date now = new Date(); System.out.println("الوقت الحالي: " + now);

// المُنشئ بالميلي ثانية (منذ 1 يناير 1970) Date specificDate = new Date(1000000000000L); System.out.println("التاريخ: " + specificDate);

// مقارنة التواريخ boolean after = now.after(specificDate); System.out.println("now بعد specificDate؟ " + after); }}


الفئة java.util.Calendar

Calendar هي فئة أكثر مرونة، لكنها لا تزال غير مريحة للتعامل مع التواريخ.

import java.util.Calendar;

public class CalendarExample { public static void main(String[] args) { Calendar cal = Calendar.getInstance(); // تعيين تاريخ محدد cal.set(2025, Calendar.MARCH, 15, 10, 30, 0); System.out.println("التاريخ المُعيّن: " + cal.getTime());

// الحصول على الحقول الفردية int year = cal.get(Calendar.YEAR); int month = cal.get(Calendar.MONTH) + 1; // الأشهر تبدأ من 0 int day = cal.get(Calendar.DAY_OF_MONTH); System.out.println("السنة: " + year + ", الشهر: " + month + ", اليوم: " + day);

// إضافة أيام cal.add(Calendar.DAY_OF_MONTH, 10); System.out.println("بعد 10 أيام: " + cal.getTime()); }}

العيوب: القابلية للتغيير (الطرق تغير الكائن نفسه)، صعوبة التعامل مع المناطق الزمنية، والارتباك في فهارس الأشهر.



2. واجهة برمجة التطبيقات الحديثة: java.time (Java 8+)

حزمة java.time تحل جميع مشاكل الفئات القديمة. الفئات الرئيسية:

  • LocalDate — تاريخ بدون وقت (سنة، شهر، يوم)؛
  • LocalTime — وقت بدون تاريخ (ساعات، دقائق، ثوانٍ، نانو ثانية)؛
  • LocalDateTime — تاريخ ووقت بدون منطقة زمنية؛
  • ZonedDateTime — تاريخ ووقت مع منطقة زمنية؛
  • Instant — لحظة زمنية في UTC؛
  • Duration و Period — للتعامل مع الفترات الزمنية.


LocalDate — التعامل مع التواريخ

import java.time.LocalDate;import java.time.Month;

public class LocalDateExample { public static void main(String[] args) { // التاريخ الحالي LocalDate today = LocalDate.now(); System.out.println("اليوم: " + today);

// تاريخ محدد LocalDate specific = LocalDate.of(2025, Month.DECEMBER, 25); System.out.println("عيد الميلاد: " + specific);

// إضافة أيام LocalDate nextWeek = to

المدونات

توصيات الكتب