واجهة برمجة التاريخ والوقت هي واحدة من أكبر الميزات في إصدار Java 8. كانت Java تفتقر إلى نهج متسق للتاريخ والوقت من البداية وواجهة برمجة التاريخ والوقت في Java 8 هي إضافة مرحب بها إلى واجهات برمجة التطبيقات الأساسية في Java.
لماذا نحتاج إلى واجهة برمجة تطبيقات Java Date Time الجديدة؟
قبل أن نبدأ في النظر إلى واجهة برمجة تاريخ ووقت Java 8، دعونا نرى لماذا نحتاج إلى واجهة برمجة تطبيقات جديدة لهذا. كانت هناك عدة مشاكل مع الفئات ذات الصلة بالتاريخ والوقت الحالية في جافا، بعضها:
- لم تُعرف فئات Java Date Time بشكل متسق، لدينا فئة Date في كل من حزمتي java.util و java.sql. مرة أخرى، تم تحديد فئات التنسيق والتحليل في حزمة java.text.
- تحتوي java.util.Date على قيم تاريخ ووقت بينما تحتوي java.sql.Date فقط على قيمة تاريخ. وجود هذا في حزمة java.sql لا يُعني أي شيء. أيضًا، كلا الفئتين لهما نفس الاسم، وهو تصميم سيء للغاية بحد ذاته.
- لا توجد فئات محددة بوضوح للوقت، الطابع الزمني، التنسيق، والتحليل. لدينا فئة java.text.DateFormat الكائنة لتلبية احتياجات التحليل والتنسيق. عادةً، يُستخدم الفصل SimpleDateFormat للتحليل والتنسيق.
- جميع فئات التاريخ قابلة للتغيير، لذا فهي غير آمنة في الخيوط. إنها واحدة من أكبر المشاكل في فئات التاريخ والتقويم في Java.
- لا توفر فئة Date تدويلًا، ولا دعم للمناطق الزمنية. لذلك تم تقديم فئتي java.util.Calendar و java.util.TimeZone، ولكنهما لديهما جميع المشاكل المذكورة أعلاه.
هناك بعض المشاكل الأخرى مع الأساليب المعرفة في فئات Date و Calendar ولكن المشاكل المذكورة أعلاه توضح بوضوح أنه كان هناك حاجة إلى واجهة برمجة تطبيقات للتاريخ والوقت قوية في جافا. لهذا السبب لعبت Joda Time دورًا رئيسيًا كبديل جيد الجودة لمتطلبات تاريخ ووقت جافا.
مبادئ تصميم تاريخ ووقت جافا 8
واجهة برمجة تطبيقات تاريخ ووقت جافا 8 هي تنفيذ لـ JSR-310. تم تصميمها للتغلب على جميع العيوب في تنفيذات التاريخ والوقت التقليدية. بعض مبادئ تصميم واجهة برمجة تطبيقات التاريخ والوقت الجديدة هي:
-
اللاقابلية للتغيير: جميع الفئات في واجهة برمجة تطبيقات التاريخ والوقت الجديدة لا تقبل التغيير وهي جيدة للبيئات متعددة الخيوط.
-
فصل الاهتمامات: تفصل الواجهة الجديدة بوضوح بين التاريخ والوقت القابل للقراءة بشكل بشري والوقت الآلي (الطابع الزمني ليونكس). وهي تحدد فئات منفصلة للتاريخ، الوقت، التاريخ والوقت المجتمعي، الطابع الزمني، المنطقة الزمنية، وما إلى ذلك.
-
الوضوح: تم تحديد الطرق بوضوح وتقوم بنفس الإجراء في جميع الفئات. على سبيل المثال، للحصول على الحالة الحالية لدينا طريقة now(). هناك طرق format() و parse() المحددة في جميع هذه الفئات بدلاً من وجود فئة منفصلة لها.
جميع الفئات تستخدم نمط الصانع (Factory Pattern) ونمط الاستراتيجية (Strategy Pattern) لمعالجة أفضل. بمجرد استخدام الطرق في إحدى الفئات، لن يكون العمل مع الفئات الأخرى صعبًا.
-
العمليات المساعدة: تأتي جميع فئات واجهة برمجة التطبيقات الجديدة للتاريخ والوقت مع أساليب لأداء المهام الشائعة، مثل الجمع، والطرح، والتنسيق، والتحليل، والحصول على الجزء المنفصل في التاريخ/الوقت، إلخ.
-
قابل للتوسيع: تعمل واجهة برمجة التطبيقات الجديدة للتاريخ والوقت على نظام التقويم ISO-8601 ولكن يمكننا استخدامها مع أنظمة تقويم غير ISO أيضًا.
حزم واجهة برمجة التطبيقات للتاريخ والوقت
تتكون واجهة برمجة التطبيقات للتاريخ والوقت في جافا 8 من الحزم التالية.
- java.time: هذه هي الحزمة الأساسية لواجهة برمجة التطبيقات الجديدة للتاريخ والوقت في جافا. جميع الفئات الأساسية الرئيسية هي جزء من هذه الحزمة، مثل LocalDate، LocalTime، LocalDateTime، Instant، Period، Duration، إلخ. جميع هذه الفئات لا تتغير وآمنة للتعددية الخيوط. في معظم الأحيان، ستكون هذه الفئات كافية للتعامل مع المتطلبات الشائعة.
- java.time.chrono: تعرّف هذه الحزمة واجهات برمجة التطبيقات العامة لأنظمة التقويم غير ISO. يمكننا توسيع فئة AbstractChronology لإنشاء نظام تقويم خاص بنا.
- java.time.format: تحتوي هذه الحزمة على فئات تستخدم لتنسيق وتحليل كائنات التاريخ والوقت. في معظم الأحيان لن نستخدمها مباشرة بسبب الفئات الرئيسية في حزمة java.time التي توفر أساليب التنسيق والتحليل.
- java.time.temporal: تحتوي هذه الحزمة على كائنات زمنية ويمكننا استخدامها لمعرفة التواريخ أو الأوقات المحددة المتعلقة بكائنات التاريخ/الوقت. على سبيل المثال، يمكننا استخدامها لمعرفة أول أو آخر يوم في الشهر. يمكنك التعرف على هذه الأساليب بسهولة لأنها تحمل دائمًا التنسيق “withXXX”.
- java.time.zone Package: تحتوي هذه الحزمة على فئات تدعم مختلف المناطق الزمنية وقواعدها.
Java 8 Date Time API Classes Examples
لقد قمنا بالنظر في معظم الأجزاء الهامة لـ Java Date Time API. حان الوقت الآن للنظر في الفئات الأكثر أهمية لـ Date Time API مع الأمثلة.
1. LocalDate
LocalDate هي فئة لا يمكن تغييرها تمثل تاريخًا بتنسيق افتراضي yyyy-MM-dd. يمكننا استخدام الطريقة now() للحصول على التاريخ الحالي. يمكننا أيضًا توفير الوسائط الدخلية لسنة وشهر وتاريخ لإنشاء مثيل LocalDate.
تقدم هذه الفئة طريقة محملة لـ now() حيث يمكننا تمرير ZoneId للحصول على التواريخ في منطقة زمنية محددة. تقدم هذه الفئة نفس الوظيفة كـ java.sql.Date.
يتم توضيح طرق LocalDate في التعليقات. عند تشغيل هذا البرنامج، نحصل على الناتج التالي.
2. LocalTime
LocalTime هي فئة لا تتغير، والتي يُمثل مثيلها الوقت في تنسيق قابل للقراءة من الإنسان. التنسيق الافتراضي لها هو ساعة:دقيقة:ثانية.زوز. تمامًا كما هو الحال مع LocalDate، توفر هذه الفئة دعمًا للمنطقة الزمنية وإنشاء مثيل عن طريق تمرير الساعة والدقيقة والثانية كمعاملات إدخالية.
الإخراج:
3. LocalDateTime
LocalDateTime هو كائن تاريخ-ووقت لا يمكن تغييره يُمثّل تاريخًا ووقتًا بتنسيق افتراضي كـ yyyy-MM-dd-HH-mm-ss.zzz. يوفر طريقة مصنع يأخذ مدخلات LocalDate و LocalTime لإنشاء مثيل LocalDateTime.
في جميع الأمثلة الثلاث، رأينا أنه إذا قدمنا مدخلات غير صالحة لإنشاء التاريخ/الوقت، فإنه يُطرح java.time.DateTimeException، وهو RuntimeException لذا لا يلزمنا التقاطه بوضوح.
لقد رأينا أيضًا أنه يمكننا الحصول على بيانات التاريخ/الوقت عن طريق تمرير ZoneId، يمكنك الحصول على قائمة القيم المدعومة لـ ZoneId من JavaDoc الخاص به. عند تشغيل الفصل أعلاه، نحصل على الإخراج التالي.
4. فوري
يُستخدم فئة Instant للعمل مع تنسيق الوقت القابل للقراءة بواسطة الآلة. تخزن Instant التاريخ والوقت في الطابع الزمني لـ Unix.
الإخراج:
وحدات تاريخ جافا 8
معظم فئات مبادئ تاريخ الوقت توفر مجموعة متنوعة من الأساليب المساعدة مثل زيادة/نقصان الأيام، الأسابيع، الشهور إلخ. هناك بعض الأساليب المساعدة الأخرى لضبط التاريخ باستخدام TemporalAdjuster
ولحساب الفترة بين تاريخين.
الناتج:
تحليل وتنسيق التواريخ في جافا 8
من الشائع جدًا تنسيق التاريخ بتنسيقات مختلفة ومن ثم تحليل سلسلة نصية للحصول على كائنات تاريخ ووقت.
الناتج:
دعم تاريخ/وقت التراث في واجهة برمجة التطبيقات لجافا
تستخدم فئات التاريخ/الوقت التراث في معظم التطبيقات تقريبًا، لذلك يجب أن يكون هناك التوافق مع الإصدارات السابقة. ولهذا السبب هناك العديد من الطرق المساعدة التي يمكننا من خلالها تحويل الفئات التراثية إلى الفئات الجديدة والعكس بالعكس.
الناتج:
كما يمكنك أن ترى أن طرق toString() لفئات TimeZone وGregorianCalendar التراثية طويلة وغير ودية للمستخدم.
الاستنتاج
I like this new Date Time API a lot. Some of the most used classes will be LocalDate and LocalDateTime. It’s very easy to work with the new classes. And, having similar methods that does a particular job makes it easy to find. It will take some time from moving legacy classes to new Date Time classes, but I believe it will be worth the time and effort.
Source:
https://www.digitalocean.com/community/tutorials/java-8-date-localdate-localdatetime-instant