بالإضافة إلى تعبيرات Lambda والتيارات والعديد من التحسينات الطفيفة ، قدمت Java 8 أيضًا مجموعة جديدة من APIs وتاريخها. لطالما تم انتقاد معالجة Java للتواريخ والتقويمات والوقت ، وخاصة قرارها بتحديد java.util.date على أنها قابلة للتعديل وتنفيذ SimpleDateFormat باعتبارها غير آمنة. يبدو أن Java أدركت أنها تحتاج إلى تقديم دعم أفضل لوظيفة الوقت والتاريخ ، وهو أمر جيد أيضًا للمجتمعات التي تستخدم لاستخدام مكتبة وقت Joda وتاريخها. إن أكبر ميزة لمكتبة الوقت والتاريخ الجديدة هذه هي أنها تحدد بوضوح بعض المفاهيم المتعلقة بالوقت والتاريخ ، مثل الوقت الفوري (الفوري) ، والمدة (المدة) ، والتاريخ (التاريخ) ، والوقت (الوقت) ، والمنطقة الزمنية (الوقت (الوقت -منطقة) والفترة الزمنية (الفترة). كما أنه يعتمد على بعض مزايا مكتبة جودا ، مثل التمييز بين فهم الوقت والتاريخ بين البشر والآلات. لا تزال Java 8 تستخدم نظام تقويم ISO ، وعلى عكس سابقاتها ، فإن الفصول الدراسية في حزمة Java.time غير قابلة للتغيير وتأمين الخيط. يقع API للوقت والتاريخ الجديد في حزمة Java.time.
1. تمثل طابع زمني
2. LocalDate-لا يتضمن الوقت المحدد ، مثل 2014-01-14. يمكن استخدامه لتخزين أعياد الميلاد ، والذكرى ، وتواريخ التعريفي ، وأكثر من ذلك.
3.localtime - يمثل وقتًا بدون تواريخ
4.localdateTime-It يحتوي على تاريخ ووقت ، ولكن لا يوجد أي معلومات إزاحة أو منطقة زمنية.
5.ZonedDateTime - هذا تاريخ ووقت كامل يحتوي على المنطقة الزمنية ، ويستند الإزاحة على وقت UTC/Greenwich.
تضيف المكتبة الجديدة أيضًا ZoneOffset و Zoned ، والتي يمكن أن توفر دعمًا أفضل للمناطق الزمنية. مع DateTimeFormatter الجديد ، أصبح تحليل وتنسيق التواريخ جديدة أيضًا. مجرد ذكر هذا المقال ، كتبت هذا المقال عندما كانت جافا على وشك إطلاق هذه الميزة الجديدة في هذا الوقت من العام الماضي ، لذلك ستجد أن الوقت في الأمثلة لا يزال من العام الماضي. إذا قمت بتشغيل هذه الأمثلة ، فإن القيم التي يرجعون إليها صحيحة بالتأكيد.
كيف تعالج Java 8 الوقت والتاريخ
سألني أحدهم ما هي أفضل طريقة لتعلم مكتبة جديدة؟ جوابي هو ، هو استخدامه في المشاريع الفعلية. ستكون هناك مجموعة متنوعة من الاحتياجات في مشروع حقيقي ، مما سيؤدي إلى استكشاف هذه المكتبة الجديدة والبحث فيها. باختصار ، إن المهمة نفسها هي فقط تشجعك حقًا على استكشاف والتعلم. وينطبق الشيء نفسه على تاريخ ووقت API الجديد من Java 8. لتعلم هذه المكتبة الجديدة من Java 8 ، قمت هنا بإنشاء 20 مثالًا موجهًا للمهمة. لنبدأ بمهمة بسيطة ، مثل كيفية استخدام مكتبة Java 8 Time and Date لتمثيلها اليوم ، ثم إنشاء تاريخ كامل مع الوقت والمنطقة الزمنية ، ثم دراسة كيفية إكمال بعض المهام العملية ، مثل تطوير تطبيق تذكير لمعرفة عدد الأيام التي يجب أن تكون فيها قبل تواريخ معينة مثل أعياد الميلاد أو ذكرى الأحد أو يوم الفواتير التالي أو يوم انتهاء صلاحية بطاقة الائتمان التالي.
مثال 1 كيفية الحصول على تاريخ اليوم في جافا 8
يوجد فصل في Java 8 يسمى LocalDate ، والذي يمكن استخدامه لتمثيل تاريخ اليوم. تختلف هذه الفئة قليلاً عن java.util.date لأنها تحتوي فقط على تواريخ ولا يوجد وقت. لذلك إذا كنت بحاجة فقط إلى تمثيل التاريخ دون تضمين الوقت ، فيمكنك استخدامه.
نسخة الكود كما يلي:
LocalDate اليوم = localdate.now () ؛
الإخراج
التاريخ المحلي اليوم: 2014-01-14
يمكنك أن ترى أنه يخلق تاريخ اليوم بدون معلومات زمنية. كما أنه يمنع التاريخ ثم يخرجه.
مثال 2 كيفية الحصول على العام الحالي والشهر واليوم في Java 8
توفر فئة LocalDate بعض الطرق المريحة لاستخراج سمات السنة والشهر واليوم وغيرها من سمات التاريخ. باستخدام هذه الطرق ، يمكنك الحصول على أي سمات تاريخ تحتاجها ، دون استخدام فئات مثل java.util.calendar:
نسخة الكود كما يلي:
LocalDate اليوم = localDate.Now () ؛
int year = today.getyear () ؛
int month = today.getMonthValue () ؛
int day = today.getDayOfMonth () ؛
System.out.printf ("السنة: ٪ D الشهر: ٪ D اليوم: ٪ d /t ٪ n" ، السنة ، الشهر ، اليوم) ؛
الإخراج
التاريخ المحلي اليوم: 2014-01-14
السنة: 2014 الشهر: يوم واحد: 14
كما ترون ، من السهل جدًا الحصول على معلومات السنة والشهر في Java 8. ما عليك سوى استخدام طريقة getter المقابلة ، بدون ذاكرة ، وهي بديهية للغاية. يمكنك مقارنتها مع طريقة الكتابة القديمة للحصول على العام والشهر واليوم الحاليين في Java.
مثال 3 كيفية الحصول على تاريخ محدد في Java 8
في المثال الأول ، نرى أنه من السهل جدًا إنشاء تاريخ اليوم من خلال الطريقة الثابتة الآن () ، ولكن من خلال طريقة مصنع أخرى مفيدة للغاية localdate.of () ، يمكنك إنشاء أي تاريخ ، والذي يقبل المعلمة من العام والشهر واليوم ، ثم يعيد مثال محلي مكافئ. هناك أخبار أخرى جيدة حول هذه الطريقة التي لم ترتكب أي أخطاء في واجهة برمجة التطبيقات السابقة. كل ما تكتبه عن التاريخ هنا ، على سبيل المثال ، في المثال أدناه ، فإنه يمثل 14 يناير ، وليس هناك منطق مخفي.
نسخة الكود كما يلي:
localdate dateOfbirth = localDate.of (2010 ، 01 ، 14) ؛
System.out.println ("تاريخ ميلادك هو:" + DateOfbirth) ؛
الإخراج: تاريخ ميلادك هو: 2010-01-14
يمكن ملاحظة أن تاريخ الخلق هو ما كتبناه ، 14 يناير 2014.
مثال 4 كيفية التحقق مما إذا كان تاريخان متساويان في Java 8
إذا تحدثت عن المهمة الفعلية المتمثلة في معالجة وقت وتاريخ في الواقع ، فإن أحد الأشياء الشائعة هو التحقق مما إذا كان التواريخ متساوية. غالبًا ما تواجه أسئلة حول ما إذا كان اليوم يومًا خاصًا ، مثل عيد الميلاد أو الذكرى أو العطلات. في بعض الأحيان ، سيتم منحك موعدًا للتحقق مما إذا كان يومًا معينًا ، على سبيل المثال ، عطلة. سيساعدك المثال التالي على إكمال هذا النوع من المهمة في Java 8. كما تعتقد ، يتجاوز LocalDate طريقة متساوية لمقارنة التواريخ على النحو التالي:
نسخة الكود كما يلي:
DateDate 1 = localdate.of (2014 ، 01 ، 14) ؛
System.out.printf ("Today ٪ S و Date1 ٪ s هي نفس التاريخ ٪ n" ، اليوم ، Date1) ؛
}
الإخراج
اليوم 2014-01-14 والتاريخ 2014-01-14 هي نفس التاريخ
في هذه الحالة ، فإن التواريخ التي نقارنها متساوية. في الوقت نفسه ، إذا حصلت على سلسلة تاريخ منسقة في الكود ، فيجب عليك تحليلها في تاريخ قبل أن تتمكن من مقارنتها. يمكنك مقارنة هذا المثال بالطريقة التي تقارن بها Java التواريخ من قبل ، وسوف تجد أنها مثيرة للغاية.
مثال 5 كيفية التحقق من الأحداث المكررة في Java 8 ، قل عيد ميلاد
هناك مهمة عملية أخرى تتعلق بالوقت والتاريخ في Java ، وهي التحقق من الأحداث المكررة ، مثل أيام الفواتير الشهرية أو ذكرى الزفاف أو أيام السداد الشهرية أو اليوم الذي تدفع فيه أقساط التأمين كل عام. إذا كنت تعمل في شركة للتجارة الإلكترونية ، فستكون هناك بالتأكيد وحدة نمطية ترسل رغبات عيد الميلاد للمستخدمين وإرسال تحياتهم في كل عطلة مهمة ، مثل عيد الميلاد ، عيد الشكر ، وفي الهند ، قد تكون هي Deepawali مهرجان. كيف تحدد ما إذا كان مهرجانًا أم حدثًا مكررًا في Java؟ استخدم فصل يوم الشهر. يتكون هذا الفصل من شهر ويوم ، ولا يحتوي على معلومات السنة ، مما يعني أنه يمكنك استخدامها لتمثيل بعض الأيام التي تظهر بشكل متكرر كل عام. بالطبع ، هناك بعض المجموعات الأخرى ، مثل فئة السنة. كما أنه غير قابل للتغيير ويؤمن مؤشرات الترابط مثل الفئات الأخرى في مكتبة الوقت والتاريخ الجديد ، كما أنه فئة قيمة. دعنا نستخدم مثالًا لمعرفة كيفية استخدام يوم الشهر للتحقق من تاريخ مكرر:
نسخة الكود كما يلي:
localdate dateOfbirth = localDate.of (2010 ، 01 ، 14) ؛
عيد ميلاد يوم الشهر = dayday.of (dateofbirth.getMonth () ، dateOfbirth.getDayOfMonth ()) ؛
يوم الشهر CurrentMonthday = monthday.from (اليوم) ؛
if (currentmonthday.equals (عيد ميلاد)) {
System.out.println ("العديد من عوائد اليوم السعيدة !!") ؛
}آخر{
System.out.println ("آسف ، اليوم ليس عيد ميلادك") ؛
}
الإخراج: العديد من العوائد السعيدة اليوم !!
على الرغم من أن السنوات مختلفة ، إلا أن اليوم هو عيد ميلاد ، لذلك سترى رغبة عيد ميلاد في الإخراج. يمكنك ضبط وقت النظام وتشغيل البرنامج لمعرفة ما إذا كان يذكرك عندما يكون عيد ميلادك التالي.
مثال 6 كيفية الحصول على الوقت الحالي في Java 8
هذا يشبه إلى حد كبير الحصول على التاريخ الحالي في المثال الأول. هذه المرة نستخدم فصلًا يسمى LocalTime ، وهو وقت بدون تاريخ ويكون قربًا بالنسبة إلى LocalDate. هنا يمكنك أيضًا استخدام طريقة المصنع الثابت الآن () للحصول على الوقت الحالي. التنسيق الافتراضي هو HH: MM: SS: NNN ، حيث NNN هو النانوسيكونات. يمكنك مقارنتها مع كيفية الحصول على الوقت الحالي في Java 8 من قبل.
نسخة الكود كما يلي:
Time Time = localtime.now () ؛
الإخراج
التوقيت المحلي الآن: 16: 33: 33.369 // في ساعة ، دقائق ، ثواني ، ثواني نانو
كما ترون ، لا يتضمن الوقت الحالي التواريخ ، لأن الوقت المحلي لديه وقت فقط ولا تواريخ.
مثال 7 كيفية زيادة عدد الساعات في الوقت المناسب
في كثير من الأحيان نحتاج إلى إضافة ساعات أو دقائق أو ثوانٍ لحساب الوقت المستقبلي. لا يوفر Java 8 فئات غير قابلة للتغيير وآمنة الخيوط ، بل توفر أيضًا بعض الأساليب الأكثر ملاءمة مثل Plushours () لاستبدال طريقة Add () الأصلية. بالمناسبة ، تُرجع هذه الطرق إشارة إلى مثيل محلي جديد ، لأن الوقت المحلي غير قابل للتغيير ، لا تنسى تخزين هذا المرجع الجديد.
نسخة الكود كما يلي:
الوقت المحلي = localtime.now () ؛
محلي newtime = time.plushours (2) ؛
system.out.println ("الوقت بعد ساعتين:" + newtime) ؛
الإخراج:
الوقت بعد ساعتين: 18: 33: 33.369
يمكنك أن ترى أن الوقت الحالي هو 16: 33: 33.369 بعد ساعتين. يمكنك الآن مقارنتها بالطريقة القديمة لإضافة أو تناقص ساعات في Java. يمكنك معرفة الطريقة التي هي أفضل للوهلة الأولى.
مثال 8 كيفية الحصول على موعد بعد أسبوع واحد
يشبه هذا المثال السابق في الحصول على الوقت بعد ساعتين ، هنا سوف نتعلم كيفية الحصول على التاريخ بعد أسبوع واحد. يستخدم LocalDate لتمثيل التواريخ بدون وقت. نظرًا لأن LocalDate غير قابل للتغيير أيضًا ، فإن أي عملية تعديل تُرجع مثيلًا جديدًا ، لذلك لا تنسى حفظه.
نسخة الكود كما يلي:
localdate nextweek = today.plus (1 ، chronounit.weeks) ؛
System.out.println ("اليوم هو:" + اليوم) ؛
System.out.println ("التاريخ بعد أسبوع واحد:" + Nextweek) ؛
الإخراج:
اليوم هو: 2014-01-14
التاريخ بعد أسبوع واحد: 2014-01-21
يمكنك أن ترى ما سيكون التاريخ في 7 أيام ، أي أسبوع. يمكنك استخدام هذه الطريقة لإضافة شهر أو عام أو ساعة أو دقيقة أو حتى عشر سنوات ، والتحقق من فئة Chronounit في Java API للحصول على مزيد من الخيارات.
مثال 9 تاريخ حوالي عام واحد
هذا تكملة للمثال السابق. في المثال أعلاه ، تعلمنا كيفية استخدام طريقة LocalDate's Plus () لإضافة تاريخ أو أسبوع أو شهر إلى تاريخ.
نسخة الكود كما يلي:
localDatepeyear = اليوم. minus (1 ، chronounit.years) ؛
system.out.println ("التاريخ قبل 1 سنة:" + previousyear) ؛
localdate nextyear = اليوم. (1 ، سنوات) ؛
System.out.println ("التاريخ بعد 1 سنة:" + nextyear) ؛
الإخراج:
التاريخ قبل 1 سنة: 2013-01-14
التاريخ بعد 1 سنة: 2015-01-14
يمكن ملاحظة أن هناك عامين حتى الآن ، واحدة في عام 2013 ، والآخر في عام 2015 ، والسنوات تقريبًا 2014.
مثال 10 باستخدام الساعة في Java 8
يأتي Java 8 مع فصل على مدار الساعة ، والتي يمكنك استخدامها للحصول على الوقت الفوري الحالي أو التاريخ أو الوقت في منطقة زمنية معينة. يمكن استخدام الساعة بدلاً من System.CurrentTimeInmillis () و TimeZone.getDefault ().
نسخة الكود كما يلي:
// إرجاع الوقت الحالي بناءً على ساعة نظامك وتعيينه على UTC.
ساعة على مدار الساعة = clock.systemutc () ؛
System.out.println ("Clock:" + Clock) ؛
// إرجاع الوقت استنادًا إلى ساعة ساعة النظام على مدار الساعة defaultClock =
clock.systemdefaultzone () ؛
System.out.println ("Clock:" + Clock) ؛
الإخراج:
الساعة: SystemClock [z]
الساعة: SystemClock [z]
يمكنك مقارنة هذه الساعة بالتاريخ المحدد ، مثل:
نسخة الكود كما يلي:
الطبقة العامة myClass {
ساعة خاصة
عملية الفراغ العام (eventdate localdate) {
if (eventdate.isbefore (localdate.now (clock)) {
...
}
}
}
هذا مناسب تمامًا إذا كنت بحاجة إلى معالجة التواريخ في مناطق زمنية مختلفة.
مثال 11 كيفية تحديد ما إذا كان التاريخ قبل أو بعد تاريخ آخر في جافا
هذه مهمة مشتركة أيضًا في المشاريع الفعلية. كيف يمكنك معرفة ما إذا كان التاريخ قبل أو بعد تاريخ آخر ، أو متساوٍ تمامًا؟ في Java 8 ، تحتوي فئة LocalDate على طريقة iSbefore () و isafter () التي يمكن استخدامها لمقارنة تاريخين. إذا كان تاريخ استدعاء الطريقة في وقت مبكر من التاريخ المحدد ، فسيتم إرجاع طريقة ISBefore () بشكل صحيح.
نسخة الكود كما يلي:
LocalDate Tomorrow = LocalDate.of (2014 ، 1 ، 15) ؛
System.out.println ("غد يأتي بعد اليوم") ؛
}
localdate أمس = اليوم. minus (1 ، أيام) ؛
إذا (بالأمس.
System.out.println ("أمس هو اليوم قبل اليوم") ؛
}
الإخراج:
غدا يأتي بعد اليوم
أمس هو اليوم قبل اليوم
يمكن ملاحظة أن التاريخ في Java 8 بسيط للغاية. ليست هناك حاجة لاستخدام فئة أخرى مثل التقويم لإكمال مهام مماثلة.
مثال 12 التعامل مع المناطق الزمنية المختلفة في Java 8
Java 8 لا يفصل التواريخ والأوقات فحسب ، بل لديها أيضًا منطقة زمنية. هناك الآن عدة مجموعات من الفصول الزمنية المتعلقة بالمنطقة. وهو ما يعادل فئة Gregoriancalendar قبل Java 8. باستخدام هذه الفئة ، يمكنك تحويل الوقت المحلي إلى الوقت المقابل في منطقة زمنية أخرى ، مثل المثال التالي:
نسخة الكود كما يلي:
// Date and Time with timezone in Java 8 Zoneid America = ZoneId.of ("America/New_york") ؛
localDateTime localtDateAndTime = localDateTime.Now () ؛
ZonedDateTime dateandtimeinnewyork = zonedDateTime.of (localtDateAndTime ، أمريكا) ؛
System.out.println ("التاريخ والوقت الحاليين في منطقة زمنية معينة:" + dateandtimeinnewyork) ؛
الإخراج:
التاريخ والوقت الحاليين في منطقة زمنية معينة: 2014-01-14T16: 33: 33.373-05: 00 [أمريكا/new_york]
يمكنك مقارنتها بالطريقة السابقة لتحويل الوقت المحلي إلى وقت GMT. بالمناسبة ، تمامًا كما كان قبل Java 8 ، لا تجعل النص المقابل للمنطقة الزمنية خاطئًا ، وإلا فإنك ستواجه مثل هذا الاستثناء:
نسخة الكود كما يلي:
استثناء في الموضوع "الرئيسي" java.time.zone.zonerulesexception: معرف غير معروف معرف المنطقة: آسيا/طوكيو
في java.time.zone.zonerulesprovider.getProvider (Zonerulesprovider.java:272)
في java.time.zone.zonerulesprovider.getRules (Zonerulesprovider.java:227)
في java.time.zoneregion.ofid (Zoneregion.java:120)
في java.time.zoneid.of (Zoneid.Java:403)
في java.time.zoneid.of (Zoneid.Java:351)
مثال 13 كيفية تمثيل تاريخ ثابت ، مثل وقت انتهاء صلاحية بطاقة الائتمان
تمامًا كما يمثل يوم الشهر يومًا متكررًا ، يعد Yearmonth مزيجًا آخر ، يمثل تواريخ مثل تاريخ سداد بطاقة الائتمان ، وتاريخ استحقاق الإيداع الثابت ، وتاريخ استحقاق الخيارات. يمكنك استخدام هذه الفئة لمعرفة عدد الأيام الموجودة في هذا الشهر.
نسخة الكود كما يلي:
yearmonth currentyearmonth = yearmonth.now () ؛
yearmonth creditCardExpiry = yearmonth.of (2018 ، month.febred) ؛
System.out.printf ("تنتهي صلاحية بطاقة الائتمان الخاصة بك على ٪ S ٪ N" ، CreditCardExpiry) ؛
الإخراج:
أيام في الشهر 2014-01: 31
تنتهي بطاقة الائتمان الخاصة بك في 2018-02
مثال 14 كيف تتحقق من سنة Leap في Java 8
هذا ليس معقدًا. إذا كنت لا تزال ترغب في إعادة إنشاء العجلة ، فيمكنك إلقاء نظرة على هذا الرمز.
نسخة الكود كما يلي:
if (today.isleapyear ()) {
System.out.println ("هذا العام هو Leap Year") ؛
}آخر {
System.out.println ("2014 ليس سنة قفزة") ؛
}
الإخراج: 2014 ليس سنة قفزة
يمكنك التحقق من بضع سنوات أخرى لمعرفة ما إذا كانت النتائج صحيحة.
مثال 15 كم عدد الأيام والشهور التي يتم تضمينها بين تاريخين
هناك مهمة شائعة أخرى وهي حساب عدد الأيام أو الأسابيع أو السنوات التي يتم تضمينها بين تواريخين محددين. يمكنك استخدام فئة java.time.period لإكمال هذه الوظيفة. في المثال التالي ، سنحسب عدد الأشهر التي يتم فصل التاريخ الحالي عن تاريخ مستقبلي.
نسخة الكود كما يلي:
localdate java8release = localdate.of (2014 ، month.march ، 14) ؛
الفترة الفترة ttonextjavarelease =
الفترة بين (اليوم ، Java8Release) ؛
system.out.println ("شهور متبقية بين اليوم و java 8 إصدار:" + quateTonextJavarelease.getMonths ()) ؛
الإخراج:
شهور متبقية بين اليوم و Java 8 الإصدار: 2
كما ترون ، هذا الشهر هو شهر يناير ، وتاريخ إطلاق جافا 8 هو مارس ، لذلك هناك شهرين بينهما.
مثال 16 تاريخ ووقت مع إزاحة المنطقة الزمنية
في Java 8 ، يمكنك استخدام فئة ZoneOffset لتمثيل منطقة زمنية معينة ، مثل الهند هي GMT أو UTC5: 30 ، ويمكنك استخدام طريقة ZoneOffset.of () للحصول على المنطقة الزمنية المقابلة. طالما حصلت على هذه الإزاحة ، يمكنك استخدام محلي محلي وهذا الإزاحة لإنشاء وقت إزاحة.
نسخة الكود كما يلي:
dateTime localDateTime = localDateTime.of (2014 ، month.january ، 14 ، 19 ، 30) ؛
ZoneOffset Offset = ZoneOffset.of ("+05:30") ؛
تاريخ الإزاحة dateDateTime = OffsetDateTime.of (DateTime ، Offset) ؛
System.out.println ("التاريخ والوقت مع إزاحة المنطقة الزمنية في Java:" + Date) ؛
الإخراج:
التاريخ والوقت مع إزاحة المنطقة الزمنية في جافا: 2014-01-14T19: 30+05: 30
يمكنك أن ترى أن الوقت والتاريخ الحاليين مرتبطان بالمنطقة الزمنية. النقطة الأخرى هي أن OffsetDateTime هو بشكل أساسي لفهم الآلات.
مثال 17 كيفية الحصول على الطابع الزمني الحالي في Java 8
إذا كنت لا تزال تتذكر كيفية الحصول على الطابع الزمني الحالي قبل Java 8 ، فهي قطعة من الكعكة الآن. يحتوي الفئة الفورية على طريقة مصنع ثابت الآن () يمكنها إعادة الطابع الزمني الحالي ، على النحو التالي:
نسخة الكود كما يلي:
الطابع الزمني الفوري = stant.now () ؛
System.out.println ("ما هي قيمة هذه اللحظة" + الطابع الزمني) ؛
الإخراج:
ما هي قيمة هذه اللحظة 2014-01-14T08: 33: 33.379z
يمكن ملاحظة أن الطابع الزمني الحالي يحتوي على تاريخ ووقت ، وهو ما يشبه إلى حد كبير java.util.date. تحويل بينهما ، على سبيل المثال ، يتم استخدام Date.from (لحظة) لتحويل الفوري إلى java.util.date ، و date.toinstant () يتحول التاريخ إلى لحظة.
مثال 18 كيفية تحليل/تنسيق تواريخ باستخدام تنسيق محدد مسبقًا في Java 8
قبل Java 8 ، كان تنسيق الوقت والتاريخ وظيفة فنية. بفضل المتغيرات المحلية الخيطية ، هذا يجعلها عملية في بيئة متعددة الخيوط ، لكن جافا حافظت على هذه الحالة لفترة طويلة. هذه المرة يقدم تاريخًا جديدًا آمنًا للمرات والوقت. كما يأتي مع بعض التنسيقات المحددة مسبقًا ، بما في ذلك تنسيقات التاريخ الشائعة الاستخدام. على سبيل المثال ، في هذا المثال ، نستخدم تنسيق BasiciSodate المحدد مسبقًا ، والذي سيتم تنسيقه في 14 فبراير 2014 حتى 20140114.
نسخة الكود كما يلي:
String DayAfterTommor = "20140116" ؛
localdate formatted = localdate.parse (dayafterTommorour ،
dateTimeFormatter.basic_iso_date) ؛
System.out.printf ("التاريخ الذي تم إنشاؤه من السلسلة ٪ s هو ٪ s ٪ n" ، dayafterTommorour ، تنسيق) ؛
الإخراج:
التاريخ الذي تم إنشاؤه من السلسلة 20140116 هو 2014-01-16
يمكنك أن ترى أن التاريخ الذي تم إنشاؤه يطابق قيمة السلسلة المحددة ، مما يعني أن تنسيق التاريخ مختلف قليلاً.
مثال 19 كيفية استخدام تنسيق مخصص لتحليل التواريخ في جافا
في المثال أعلاه ، استخدمنا التنسيق المدمج للوقت لتحليل سلسلة التاريخ. بطبيعة الحال ، فإن التنسيق المحدد مسبقًا جيدًا ، ولكن في بعض الأحيان قد لا تزال بحاجة إلى استخدام تنسيق موعد مخصص. تنسيق التاريخ في المثال التالي هو "MMM DD YYYY". يمكنك تمرير أي نمط إلى طريقة ثابتة () من DateTimeFormatter's Ofpattern ، والتي تُرجع مثيلًا ، مع كون القيمة الحرفية لهذا النمط هي نفسها كما في المثال السابق. على سبيل المثال ، لا يزال M يمثل الشهر ، في حين أن M لا يزال الجزء. سيقوم الوضع غير الصحيح بإلقاء استثناء DateTimeParSexception ، ولكن إذا كان خطأ منطقيًا ، مثل استخدام M عندما يحين الوقت لاستخدام M ، فلا يوجد شيء يجب القيام به.
نسخة الكود كما يلي:
String Goodfriday = "Apr 18 2014" ؛
يحاول {
dateTimeFormatter formatter = dateTimeFormatter.ofpattern ("mmm dd yyyy") ؛
LocalDate Holiday = localDate.Parse (Goodfriday ، formatter) ؛
System.out.printf ("سلسلة محسورة بنجاح ٪ S ، التاريخ هو ٪ s ٪ n" ، Goodfriday ، Holiday) ؛
} catch (datetimeparsexception ex) {
system.out.printf ("٪ s غير قابل للاستبدال! ٪ n" ، goodfriday) ؛
ex.printStackTrace () ؛
}
الإخراج:
السلسلة المتوسطة بنجاح في 18 أبريل 2014 ، التاريخ هو 2014-04-18
يمكنك أن ترى أن قيمة التاريخ تتطابق مع السلسلة التي تم تمريرها ، لكن التنسيق مختلف.
مثال 20 كيفية تنسيق التواريخ وتحويلها إلى سلاسل في جافا 8
في المثالين السابقين ، على الرغم من أننا استخدمنا فئة DateTimeFormatter ، فإننا نتحلى بشكل أساسي سلسلة التاريخ. في هذا المثال ، سنفعل العكس. هنا لدينا مثيل من فئة LocalDateTime ، والتي نريد تحويلها إلى سلسلة تاريخ منسقة. هذه هي الطريقة الأسهل والأكثر ملاءمة لتحويل التواريخ إلى سلاسل في جافا. المثال التالي سيعود سلسلة منسقة. مثل المثال السابق هو أننا ما زلنا بحاجة إلى استخدام سلسلة الأنماط المحددة لإنشاء مثيل لفئة DateTimeFormatter ، ولكن المكالمة ليست طريقة تحليل فئة LocalDate ، ولكن طريقة التنسيق (). ستُرجع هذه الطريقة سلسلة تمثل التاريخ الحالي ، ويتم تعريف النمط المقابل في مثيل DateTimeFormatter الوارد.
نسخة الكود كما يلي:
localDateTime ArrivalDate = localDateTime.Now () ؛
يحاول {
DateTimeFormatter format = dateTimeFormatter.ofpattern ("mmm dd yyyy hh: mm a") ؛
سلسلة الهبوط = revivalDate.Format (format) ؛
system.out.printf ("الوصول إلى: ٪ s ٪ n" ، الهبوط) ؛
} catch (dateTimeexception ex) {
system.out.printf ("٪ s لا يمكن تنسيقه! ٪ n" ، وصل) ؛
ex.printStackTrace () ؛
}
الإخراج: الوصول إلى: 14 يناير 2014 04:33 مساءً
يمكن ملاحظة أن الوقت الحالي يمثله نمط "mmm dd yyyy hh: mm a" ، والذي يحتوي على الشهر الذي يمثله ثلاثة أحرف والوقت الذي يمثله AM و PM.
عدة نقاط رئيسية للتاريخ والوقت API في Java 8
بعد قراءة هذه الأمثلة ، أعتقد أن لديك فهمًا معينًا ل API الجديد لـ Java 8. الآن دعنا نراجع بعض العناصر الرئيسية حول واجهة برمجة التطبيقات الجديدة هذه.
1. يوفر javax.time.zoneid للتعامل مع مناطق الوقت.
2. يوفر فصول المحلية والوقت المحلي
3. جميع الفصول في وقت وتاريخ API في Java 8 هي غير قابلة للتغيير وآمنة الخيط ، والتي هي بالضبط عكس التاريخ السابق وواجهة برمجة التطبيقات التقويمية ، حيث تكون مثل Java.Util.Date و SimpledateFormat. -آمن.
4. نقطة مهمة للغاية في وقت وتاريخ API الجديد هو أنه يحدد بوضوح المفاهيم الأساسية للوقت والتاريخ ، مثل الوقت الفوري والمدة والتاريخ والوقت والمنطقة الزمنية والفترة الزمنية. تستند جميعها إلى نظام تقويم ISO.
5. يجب أن يعرف كل مطور Java هذه الفصول الخمس على الأقل في واجهة برمجة التطبيقات الجديدة هذه:
5.1) لحظة يمثل طابعًا زمنيًا ، مثل 2014-01-14T02: 20: 13.592z ، والذي يمكن الحصول عليه من فئة java.time.clock ، مثل هذا: الفوري الحالي = clock.system (Zoneid.of ("Asia /" Asia / " طوكيو ").
5.2) LocalDate يمثل تاريخًا بدون وقت ، مثل 2014-01-14. يمكن استخدامه لتخزين أعياد الميلاد ، والذكرى ، وتواريخ التعريفي ، وأكثر من ذلك.
5.3) محلي يمثل وقتًا بدون تاريخ
5.4) محلي أنه يحتوي على الوقت والتاريخ ، ولكن لا يوجد إزاحة مع منطقة زمنية
5.5) ZonedDateTime هذا هو بدوام كامل مع تعديل المنطقة الزمنية استنادًا إلى وقت UTC/Greenwich
1. الحزمة الرئيسية لهذه المكتبة هي Java.Time ، التي تحتوي على فصول تمثل التاريخ والوقت والفورية والمدة. إنه يحتوي على حذفين فرعيتين ، أحدهما هو java.time.foramt ، وهو أمر واضح ما يستخدمه هذا ، والآخر هو java.time.temporal ، والذي يمكنه الوصول إلى الحقول المختلفة من مستوى أقل.
2. تشير المنطقة الزمنية إلى المنطقة على الأرض التي تشترك في نفس الوقت القياسي. كل منطقة زمنية بها معرف فريد ، وهناك أيضًا تنسيق في المنطقة/المدينة (آسيا/طوكيو) ووقت إزاحة يبدأ من زمن غرينتش. على سبيل المثال ، وقت الإزاحة في طوكيو هو +09: 00.
3. فئة setSetDateTime تحتوي في الواقع على محلية و ZoneOffset. يتم استخدامه لتمثيل تاريخ كامل (السنة والشهر واليوم) والوقت (ساعة ، دقيقة ، نانو ثانية) يحتوي على إزاحة زمنية Greenwich (+/- الساعة: دقيقة ، على سبيل المثال +06: 00 أو -08: 00).
4. يتم استخدام فئة DateTimeFormatter لتنسيق التواريخ في Java. على عكس SimpleDateFormat ، فإنه غير قابل للتغيير وآمن مؤشر الترابط ، ويمكن تعيينه لمتغير ثابت إذا لزم الأمر. توفر فئة DateTimeFormatter العديد من التنسيقات المحددة مسبقًا ، ويمكنك أيضًا تخصيص التنسيق الذي تريده. بالطبع ، وفقًا للاتفاقية ، فإنه يحتوي أيضًا على طريقة Parse () تستخدم لتحويل السلسلة إلى تاريخ ، وإذا كان هناك أي خطأ أثناء التحويل ، فسوف يلقي استثناء DateTimeParseception. وبالمثل ، فإن فئة DateFormatter لديها أيضًا طريقة تنسيق لتنسيق التواريخ.
5. وبعبارة أخرى ، فإن تنسيقات التاريخ من "MMM D YYYY" و "MMM DD Yyyy" تختلف قليلاً. سيقوم الشخص الذي يأتي في "2 يناير 2014" بالإبلاغ عن خطأ لأنه يتوقع أن تأتي حرفين من الشهر. لحل هذه المشكلة ، إذا كان اليوم أرقامًا واحدة ، فيجب عليك تعويض 0 في المقدمة ، على سبيل المثال ، يجب تغيير "Jan 2 2014" إلى "Jan 02 2014".
هذا كل شيء عن Java 8 ، API وقت وتاريخ جديد. هذه الأمثلة القصيرة كافية لفهم بعض الفصول الجديدة في واجهة برمجة التطبيقات الجديدة هذه. نظرًا لأنه يتم شرحه استنادًا إلى المهام الفعلية ، عندما تواجه عملًا في Java يحتاج إلى معالجة الوقت والتاريخ ، لم يعد عليك البحث حولها. لقد تعلمنا كيفية إنشاء مثيلات التاريخ وتعديله. لقد تعلمنا أيضًا الاختلافات بين التواريخ الخالصة ، والوقت بالإضافة إلى الوقت ، والمناطق الزمنية بالإضافة إلى مناطق الوقت ، ومعرفة كيفية مقارنة تاريخين ، وكيفية العثور على يوم معين لتاريخ محدد ، مثل عيد الميلاد أو الذكرى أو تاريخ التأمين التالي. لقد تعلمنا أيضًا كيفية تحليل التمر والتنسيق في Java 8 بطريقة آمنة لخيط الخيط دون استخدام متغيرات مؤشر الترابط المحلي أو مكتبات الطرف الثالث. واجهة برمجة التطبيقات الجديدة المختصة في أي وقت وتاريخ المهام المتعلقة بالتاريخ.