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

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

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

ابدأ الدورة

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

المدونات

توصيات الكتب