مقدمة في العمل مع التواريخ والوقت في Java
\n\nالعمل مع التواريخ والوقت هي إحدى المهام الأساسية في تطوير أي تطبيق. سواء كان تسجيل الأحداث، حساب مواعيد التسليم، العمل مع الجداول الزمنية أو تحليل البيانات - لا يمكن الاستغناء عن فهم كيفية إدارة Java للكائنات الزمنية. في هذه المقالة، سنشرح جميع الجوانب الرئيسية: من واجهة البرمجة القديمة (Date و Calendar) إلى الحزمة الحديثة java.time (Java 8+). ستتعلم كيفية إنشاء التواريخ وتنسيقها ومقارنتها وحساب الفرق بينها.
1. واجهة البرمجة القديمة: Date و Calendar
\n\nقبل Java 8، كانت الفئات الرئيسية للعمل مع التواريخ هي java.util.Date و java.util.Calendar. لا تزال موجودة في الكود القديم (legacy)، لذلك من المهم فهم إمكانياتها الأساسية وقيودها.
1.1 فئة Date
\nDate تمثل لحظة زمنية محددة بدقة تصل إلى الميلي ثانية. ومع ذلك، لديها العديد من العيوب: فهي قابلة للتغيير (غير آمنة في التطبيقات متعددة الخيوط) وتدعم التدويل بشكل ضعيف.
import java.util.Date;\n\npublic class DateExample {\n public static void main(String[] args) {\n // التاريخ والوقت الحاليين\n Date now = new Date();\n System.out.println("التاريخ الحالي: " + now);\n\n // طريقة قديمة للحصول على السنة (1900 + ...)\n int year = now.getYear() + 1900;\n System.out.println("السنة: " + year);\n }\n}\n\n1.2 فئة Calendar
\nCalendar هي فئة أكثر مرونة ولكنها ضخمة. تسمح بالتلاعب بالمكونات الفردية للتاريخ (السنة، الشهر، اليوم).
import java.util.Calendar;\n\npublic class CalendarExample {\n public static void main(String[] args) {\n Calendar cal = Calendar.getInstance();\n System.out.println("الوقت الحالي: " + cal.getTime());\n\n // تعيين تاريخ محدد\n cal.set(2025, Calendar.MARCH, 15);\n System.out.println("التاريخ المعين: " + cal.getTime());\n\n // إضافة 7 أيام\n cal.add(Calendar.DAY_OF_MONTH, 7);\n System.out.println("بعد أسبوع: " + cal.getTime());\n }\n}\n\nالعيوب: ترقيم الأشهر يبدأ من 0 (يناير = 0)، قابلية التغيير، عدم وجود تنسيق بسيط.
\n\n2. واجهة البرمجة الجديدة: java.time (Java 8+)
\n\nبدءًا من Java 8، تمت إضافة حزمة java.time إلى المكتبة القياسية، المستندة إلى أفكار مكتبة Joda-Time. تتكون من فئات غير قابلة للتغيير (immutable)، مما يجعل الكود آمنًا وقابلًا للتنبؤ.
2.1 LocalDate — التاريخ فقط
\nLocalDate تمثل تاريخًا بدون وقت (سنة، شهر، يوم). مثالية لأعياد الميلاد، التقاويم.
import java.time.LocalDate;\nimport java.time.Month;\n\npublic class LocalDateExample {\n public static void main(String[] args) {\n // التاريخ الحالي\n LocalDate today = LocalDate.now();\n System.out.println("اليوم: " + today);\n\n // تاريخ محدد\n LocalDate specificDate = LocalDate.of(2025, Month.DECEMBER, 31);\n System.out.println("رأس السنة: " + specificDate);\n\n // إضافة/طرح أيام\n LocalDate nextWeek = today.plusDays(7);\n System.out.println("بعد أسبوع: " + nextWeek);\n }\n}\n\n2.2 LocalTime — الوقت فقط
\nLocalTime يخزن الوقت (ساعات، دقائق، ثوانٍ، نانو ثانية) بدون ربط بالتاريخ.
import java.time.LocalTime;\n\npublic class LocalTimeExample {\n public static void main(String[] args) {\n LocalTime now = LocalTime.now();\n System.out.println("الوقت الحالي: " + now);\n\n LocalTime meeting = LocalTime.of(14, 30);\n System.out.println("الاجتماع في: " + meeting);\n\n // مقارنة الوقت\n if (now.isAfter(meeting)) {\n System.out.println("الاجتماع قد انتهى بالفعل");\n }\n }\n}<