الأصل: http://it.deepinmind.com/java/2015/03/17/20-examples-date-ndate-di-from-java8.html
بالإضافة إلى تعبيرات Lambda ، قدمت العديد من التحسينات الصغيرة ، كما أن Java 8 قدمت مجموعة جديدة من الوقت والتاريخ في هذا البرنامج التعليمي. لقد تم دائمًا انتقاد تواريخ Java والتقويمات ومعالجة الوقت ، خاصة أنه يقرر تحديد java.util.date كمعدّل واستخدام SimpleDateFormat في أمان غير متخلف. يبدو أن Java أدركت أنه يحتاج إلى توفير دعم أفضل لوظائف الوقت والتاريخ ، وهو أمر جيد أيضًا للمجتمع الذي اعتاد على استخدام قاعدة بيانات وقت Joda. أكبر ميزة لمكتبة الوقت والتاريخ الجديد هي أنها تحدد بعض المفاهيم المتعلقة بالوقت والتاريخ. والفترة. في الوقت نفسه ، فإنه يستعير أيضًا بعض مزايا مكتبة جودا ، مثل التمييز بين الأشخاص والآلات لتمييز تاريخ الوقت. لا تزال Java 8 تستخدم نظام تقويم ISO ، وعلى عكس سابقاتها ، فإن الفصول الدراسية في حزمة Java.time غير قابلة للتأثير. يقع API للوقت والتاريخ الجديد في حزمة Java.time.
تضيف المكتبة الجديدة أيضًا ZoneOffset ومخصصة لتوفير دعم أفضل للمنطقة الزمنية. مع DateTimeFormatter الجديد ، أصبح تحليل وتنسيق التاريخ بعد التاريخ جديدًا. فقط أذكر ذلك ، كنت أكتب هذا المقال عندما كانت Java على وشك إطلاق هذه الميزة الجديدة في هذا الوقت ، لذلك ستجد أن الوقت في المثال هو العام الماضي. إذا قمت بتشغيل هذه الأمثلة ، فيجب أن تكون القيم التي يعودون صحيحة.
سألني أحدهم ما هي أفضل طريقة لتعلم مكتبة جديدة؟ إجابتي هي استخدامه في المشاريع الفعلية. سيكون هناك مجموعة متنوعة من الاحتياجات في مشروع حقيقي ، سيعزز المطورين لاستكشاف ودراسة هذه المكتبة الجديدة. باختصار ، فقط المهمة نفسها هي التي ستعززك حقًا لاستكشاف والتعلم. التاريخ والوقت الجديد API من Java 8 هو نفسه. من أجل تعلم هذه المكتبة الجديدة من Java 8 ، قمت بإنشاء 20 من الأمثلة الموجهة نحو المهمة هنا. لنبدأ بمهمة بسيطة. القول بأنه يقال إن تطوير تطبيق للتذكير لمعرفة تاريخ محدد مثل عيد ميلاد ، ذكرى الأحد ، تاريخ الحساب التالي ، كم عدد الأيام الموجودة في تاريخ انتهاء صلاحية بطاقة الائتمان التالية.
يوجد فصل يسمى LocalDate في Java 8 ، والذي يمكن استخدامه لتمثيل تاريخ اليوم. تختلف هذه الفئة قليلاً عن java.util.date ، لأنها تحتوي فقط على التاريخ وليس لها وقت. لذلك ، إذا كنت بحاجة فقط إلى الإشارة إلى التاريخ بدلاً من الوقت ، فيمكنك استخدامه.
LocalDate = localdate.now () ؛
يمكنك أن ترى أنه يخلق اليوم ولكنه لا يتضمن معلومات الوقت. كما أنه يشكل تنسيق التاريخ ويؤدي إلى إخراجه.
توفر فئة LocalDate بعض الطرق المريحة للغاية لاستخدام التاريخ وسمات التاريخ الأخرى التي يمكن استخدامها لاستخراجها. باستخدام هذه الطرق ، يمكنك الحصول على أي سمة تاريخ تحتاجها ، ولم تعد بحاجة إلى استخدام فئة مثل java.util.calendar:
localdate = localdate.now () السنة ، الشهر ، الإخراج اليوم التاريخ المحلي: 2014-01-14 سنة: 2014 الشهر: 1 يوم: 14
يمكن ملاحظة أنه من السهل جدًا الحصول على المعلومات السنوية في Java 8. إنها تحتاج فقط إلى استخدام طريقة getter المقابلة ، لا توجد ذاكرة ، بديهية للغاية. يمكنك مقارنتها مع كتابة الشهر واليوم الحاليين في جافا.
في المثال الأول ، نرى أنه من السهل جدًا إنشاء تاريخ اليوم من خلال الطريقة الثابتة ، ولكن من خلال طريقة مصنع أخرى مفيدة للغاية ، يمكنك إنشاء أي تاريخ. العام ، الشهر ، ثم إرجاع مثيل محلي مكافئ. الأخبار السارة حول هذه الطريقة هي أنها لم ترتكب أي أخطاء في واجهة برمجة التطبيقات من قبل. ما تكتبه هنا هو ما تكتبه هنا ، على سبيل المثال ، في المثال التالي ، يمثل 14 يناير ، لا يوجد منطق مخفي.
LocalDate DateOfbirth = localdate.of (2010 ، 01 ، 14) ؛
يمكن ملاحظة أن تاريخ الإنشاء هو ما نكتبه ، 14 يناير 2014.
عند الحديث عن مهام وقت المعالجة الفعلية والتاريخ في الواقع ، من الشائع التحقق مما إذا كان تاريخان متساويان. قد تواجه في كثير من الأحيان ما إذا كنت ستحكم على ما إذا كان اليوم يومًا خاصًا ، مثل عيد الميلاد أو الذكرى السنوية أو العطلات. في بعض الأحيان ، ستمنحك موعدًا حتى تتمكن من التحقق مما إذا كان يومًا معينًا. المثال التالي سيساعدك على إكمال مثل هذه المهام في Java 8. كما تعتقد ، أعاد LocalDate كتابة طريقة متساوية لمقارنة التاريخ ، كما هو موضح أدناه:
DateDate 1 = localdate.of (2014 ، 01 ، 14) ؛ 2014-01-14 و DATE1 2014-01-14 هي نفس التاريخ
في هذا المثال ، فإن المقارنة بين المواعيد متساوية. في الوقت نفسه ، إذا حصلت على سلسلة تاريخ منسقة في الكود ، فيجب عليك حلها كتاريخ قبل أن تتمكن من مقارنتها. يمكنك مقارنة هذا المثال لمقارنة المقارنة السابقة لـ Java ، وسوف تجد أنه أفضل بكثير.
هناك أيضًا مهمة عملية تتعلق بتاريخ الوقت في جافا للتحقق من الأحداث المكررة. إذا كنت تعمل في شركة تماثل ، فستكون هناك الوحدة النمطية التي سترسل رغبات عيد الميلاد إلى المستخدمين ومنحهم تحياتهم في كل عطلة مهمة ، مثل عيد الميلاد ، في الهند ، قد يكون ذلك ممكنًا في الهند هو ديباوالي. كيف تحدد ما إذا كان مهرجانًا أو حادثًا متكررًا في جافا؟ استخدم فصل يوم الشهر. يتم دمج هذه الفئة بحلول الشهر ولا تتضمن معلومات سنوية ، مما يعني أنه يمكنك استخدامها لتمثيل بعض الأيام التي تظهر كل عام. بالطبع ، هناك بعض المجموعات الأخرى ، مثل فئة السنة. كما أنه غير قادر على التغيير والخيوط بأمان كأنواع أخرى في مكتبة الوقت الجديدة ، وهي أيضًا فئة قيمة. دعونا نرى كيفية استخدام يوم الشهر للتحقق من تاريخ مكرر:
LocalDate Dtealday. println ("العديد من العوائد السعيدة اليوم !!") ؛على الرغم من أن السنة مختلفة ، إلا أن اليوم هو يوم عيد ميلاد ، لذلك سترى نعمة عيد ميلاد في الإخراج. يمكنك ضبط وقت النظام وتشغيل البرنامج لمعرفة ما إذا كان يمكن أن يذكرك عندما يكون عيد الميلاد التالي.
هذا مشابه جدًا للتاريخ الحالي في المثال الأول. هذه المرة نستخدم فصلًا يسمى LocalTime. هنا يمكنك أيضًا استخدام طريقة مصنع ثابت الآن () للحصول على الوقت الحالي. التنسيق الافتراضي هو HH: MM: SS: NNN ، و NNN هنا هو النانو ثانية. يمكن مقارنته بكيفية الحصول على الوقت الحالي مع Java 8.
Time Time = localtime.now () ؛
يمكن ملاحظة أن الوقت الحالي لا يتضمن التاريخ ، لأن الوقت المحلي ليس له سوى الوقت ولا يوجد تاريخ.
في كثير من الأحيان نحتاج إلى زيادة الوقت المستقبلي في كل دقيقة أو ثانية. لا يوفر Java 8 فئات غير متغيرة وخيط آمن فقط ، بل توفر أيضًا بعض الأساليب الأكثر ملاءمة مثل Plushours () لاستبدال طريقة ADD () الأصلية. بالمناسبة ، تُرجع هذه الطرق إشارة إلى مثيل محلي جديد ، لأن الوقت المحلي غير قابل للتغيير ، لا تنسى تخزين هذا المرجع الجديد.
Time Time = localtime.now () ؛ : 33.369
يمكنك أن ترى أنه بعد ساعتين من الوقت الحالي ، هو 16: 33: 33.369. يمكنك الآن مقارنتها بالطريقة القديمة لإضافة أو تقليل الطريق القديم في Java. للوهلة الأولى ، أنت تعرف الطريقة الأفضل.
هذا مشابه للمثال السابق للساعتين السابقتين. يتم استخدام LocalDate للإشارة إلى التاريخ بدون وقت. نظرًا لأن LocalDate غير قابل للتغيير أيضًا ، فإن أي عملية تعديل ستعيد مثالًا جديدًا ، لذلك لا تنسى حفظه.
LocalDate Nextweek = اليوم (1) IS: 2014-01-14 التاريخ بعد أسبوع واحد: 2014-01-21
يمكنك أن ترى ما هو التاريخ بعد 7 أيام. يمكنك استخدام هذه الطريقة لزيادة شهر واحد أو عام واحد أو ساعة أو دقيقة واحدة أو حتى عشر سنوات ، والتحقق من فئة Chronounit في Java API للحصول على مزيد من الخيارات.
هذا هو تكملة المثال السابق. في المثال أعلاه ، تعلمنا كيفية استخدام طريقة Plus () لـ LocalDate لزيادة تاريخ التاريخ أو الأسبوع أو الشهر.
LocalDate Previcyear = اليوم. " + nextyear) ؛ الإخراج: التاريخ قبل 1 سنة: 2013-01-14 التاريخ بعد 1 سنة: 2015-01-14
يمكن ملاحظة أن هناك عامين في المجموع ، والآخر هو 2013 ، والآخر هو 2015 ، وهو العام قبل عام 2014 وبعدها.
يأتي Java 8 مع فصل على مدار الساعة ، يمكنك استخدامه للحصول على الوقت الحالي أو التاريخ أو الوقت الحالي في منطقة زمنية معينة. يمكنك استخدام الساعة لاستبدال System.CurrentTimeInMillis () و TimeZone.getDefault ().
// إرجاع الوقت الحالي على مدار الساعة ويعينها على مدار الساعة. .SystemDefaultZone () ؛
يمكنك استخدام التاريخ المحدد للمقارنة مع هذه الساعة ، على سبيل المثال ، على النحو التالي:
الطبقة العامة myClass {ساعة خاصةإذا كنت بحاجة إلى التعامل مع تواريخ المناطق الزمنية المختلفة ، فهذا مناسب تمامًا.
هذه مهمة مشتركة أيضًا في المشاريع الفعلية. كيف تحكم على ما إذا كان تاريخ معين أمام أو خلف تاريخ آخر ، أو متساوٍ فقط؟ في Java 8 ، تحتوي فئة LocalDate على أساليب Isbefore () و isafter () التي يمكن استخدامها لمقارنة تواريخين. إذا كان تاريخ طريقة الاتصال في وقت مبكر من تاريخ معين ، فسيتم إرجاع طريقة ISBefore () بشكل صحيح.
localdate tomomorrow = localdate.of (2014 ، 1 ، 15) ؛ ؛
يمكن ملاحظة أن التاريخ في Java 8 بسيط نسبيًا. لا حاجة لاستخدام فئة أخرى مثل التقويم لإكمال مهام مماثلة.
Java 8 لا يفصل فقط التاريخ والوقت ، ولكن أيضًا في بعض الأحيان مناطق. هناك بالفعل العديد من المجموعات المتعلقة بالمناطق الزمنية. وهو ما يعادل فئة Gregoriancalendar قبل Java 8. باستخدام هذه الفئة ، يمكنك تحويل الوقت المحلي إلى الوقت المقابل في منطقة زمنية أخرى ، مثل المثال التالي:
// تاريخ ووقت مع جافا 8 Zoneid America = ZoneId.of ("American/News") ؛ الزمن: " + dateandtimeinnewyork) ؛ الإخراج: التاريخ والوقت الحاليين في منطقة زمنية معينة: 2014-01-14T16: 33.373-05: 00 [American/New_york]يمكن مقارنته بوقت تحويل الوقت المحلي إلى وقت GMT. بالمناسبة ، كما كان من قبل Java 8 ، يجب ألا يخطئ النص في المنطقة الزمنية المقابلة ، وإلا فإنك ستواجه مثل هذا الاستثناء:
استثناء في الموضوع "الرئيسي" java.time.zone.zonerseexception: معرف غير معروف معرف المنطقة: آسيا/طوكيو في lesprovider.java:272) في java.time.zone.zonerulesprovider.getrules (Zonerulesprovider.java:227) في java. time.zoneregy.ofid (Zoneregy.java:120) في java.time.zoneid.of (Zoneid.Java:403) في java.time.zoneid.o f (Zoneid.Java: 351)
كما هو الحال مع يوم الشهر يعبر عن يوم مكرر ، يعد Yearmonth مزيجًا آخر. يمكنك استخدام هذه الفئة لمعرفة عدد الأيام في ذلك الشهر ، طول الطول () هذه الطريقة تُرجع عدد الأيام التي تعتبر فيها مثيل السنة ، وهو أمر مفيد للغاية للتحقق مما إذا كان 28 يومًا في فبراير أو 29 يومًا.
yearmonth currentyearmonth = yearmonth.now () ؛ ؛
هذا ليس معقدًا. إذا كنت لا تزال ترغب في تكرار العجلة ، يمكنك رؤية هذا الرمز.
if (اليوم
يمكنك التحقق من بضع سنوات لمعرفة ما إذا كانت النتائج صحيحة.
هناك مهمة شائعة أخرى وهي حساب عدد الأيام ، وعدد الأسابيع أو السنوات التي يتم تضمينها بين التواريخ المعطاة. يمكنك استخدام فئة Java.time. في المثال التالي ، سنحسب ما مجموعه عدة أشهر قبل التاريخ الحالي والتاريخ المستقبلي.
localdate java8release = localdate.of (2014 ، march ، 14) ؛ ) ؛
يمكن ملاحظة أن هذا الشهر هو شهر يناير ، وتاريخ إصدار Java 8 هو مارس ، لذلك فهو على وشك شهرين.
في Java 8 ، يمكنك استخدام فئة ZoneOffset لتمثيل منطقة زمنية معينة. طالما حصلت على هذه الإزاحة ، يمكنك استخدام محلي محلي وهذا الإزاحة لإنشاء وقت واحد.
LocalDaletime dotetime = LocalDateM.of (2014 ، Manuary ، 14 ، 19 ، 30) ؛ .
يمكن ملاحظة أن التاريخ الحالي يرتبط بالمنطقة الزمنية. النقطة الأخرى هي أن الجهاز يفهم بشكل أساسي من قبل الماكينة.
إذا كنت لا تزال تتذكر كيفية الحصول على الطابع الزمني الحالي قبل Java 8 ، فهذا ببساطة طبق صغير. لدى الفئة الفورية طريقة مصنع ثابت الآن () لإرجاع الطابع الزمني الحالي ، على النحو التالي:
Timestamp = stant.now () ؛
يمكن ملاحظة أن الطابع الزمني الحالي يتضمن التاريخ والوقت ، وهو ما يشبه java.util.date. في java.util.date ، و date.toinstant () يحول التاريخ إلى لحظة.
قبل Java 8 ، يكون تنسيق تاريخ الوقت هو عمل فني. بفضل المتغيرات المحلية للخيط ، جعلها مفيدة في بيئة متعددة الفرات ، لكنها مضى وقت طويل على جافا للحفاظ على هذه الحالة. هذه المرة قدمت تنسيقًا جديدًا لتاريخ أمان مؤشر الترابط وتنسيق الوقت. كما أنه يأتي مع بعض التنسيق المحدد مسبقًا ، والذي يحتوي على تنسيق التاريخ الشائع. على سبيل المثال ، في هذا المثال ، نستخدم تنسيق تاريخ ISO الأساسي المحدد مسبقًا ، والذي سيتم تنسيقه في 14 فبراير 2014 إلى 20140114.
string dayaftertommour = "20140116" ؛ -16
يمكنك أن ترى أن تاريخ الجيل يتطابق مع قيمة السلسلة المحددة ، والتي تختلف قليلاً في تنسيق التاريخ.
في المثال أعلاه ، استخدمنا تنسيق الوقت والتاريخ المدمج لحل سلسلة التاريخ. بطبيعة الحال ، فإن التنسيق المحدد مسبقًا جيدًا ، ولكن في بعض الأحيان قد لا تزال بحاجة إلى استخدام تنسيق موعد مخصص. تنسيق التاريخ في هذا المثال هو "MMM DD YYYY". يمكنك تمرير الطريقة الثابتة لـ OFPattern () إلى طريقة STATIC's () ، وسيعود إلى مثيل. على سبيل المثال ، لا يزال M يمثل الشهر ، ولا يزال M مقسمًا. سيقوم الوضع غير الصحيح بإلقاء الحالات الشاذة في DateTimeParsexception ، ولكن إذا كانت الأخطاء المنطقية ، على سبيل المثال ، يجب استخدامها على أنها M عندما يكون M ، لذلك لا توجد طريقة.
String Goodfriday = "Apr 18 2014" ؛ "، Goodfriday ، Holiday) ؛} catch (DateTimeParSexection ex) {system.out.printf (" ٪ s غير قابلة للتشويش! ٪ n "، goodfriday) ؛ ex.printstacktr ace () ؛ التاريخ هو 2014-04-18يمكن ملاحظة أن قيمة التاريخ تتفق بالفعل مع السلسلة المارة ، ولكن التنسيق مختلف.
في المثالين السابقين ، على الرغم من أننا استخدمنا فئة DateTimeFormatter ، فقد قمنا بتحليل سلسلة التاريخ بشكل أساسي. في هذا المثال ، ما يتعين علينا فعله هو عكس ذلك بالضبط. هنا لدينا مثال على فئة محلية ، ونريد تحويله إلى سلسلة تاريخ منسقة. هذه هي الطريقة الأكثر بساطة وأكثر ملاءمة لتحويل التاريخ إلى سلسلة في جافا حتى الآن. المثال التالي سيعود سلسلة منسقة. مثل المثال السابق ، ما زلنا بحاجة إلى استخدام سلسلة الوضع المحددة لإنشاء مثيل لفئة DateTimeFormatter ، ولكن طريقة تحليل فئة LocalDate ليست كذلك ، ولكن طريقة تنسيقها (). ستعيد هذه الطريقة سلسلة تمثل التاريخ الحالي ، والوضع المقابل هو المحدد في مثيل DateTimeFormatter الذي تم تقديمه.
localdaletime enclude = localDateTime.Now () ؛ system.out.printf ("٪ s لا يمكن تنسيقه! ٪ n" ، الوصول) ؛يمكن ملاحظة أن الوقت الحالي يمثله وضع "MMM DD Yyyy HH: MM A".
بعد قراءة هذه الأمثلة ، أعتقد أن لديك فهمًا معينًا للمجموعة الجديدة من الوقت والتاريخ من Java 8. الآن ننظر إلى الوراء في بعض العناصر الرئيسية في واجهة برمجة التطبيقات الجديدة هذه.
يجب على كل مطور Java على الأقل فهم هذه الفئات الخمس من واجهات برمجة التطبيقات الجديدة هذه:
الحقيبة الرئيسية لهذه المكتبة هي Java.Time ، التي تحتوي على الفصل والوقت والفوري ومدة تاريخ التمثيلية والوقت والفوري والمدة. إنه يحتوي على اثنين من التعبئة الفرعية ، واحد هو java.time.foramt.
تشير المنطقة الزمنية إلى المجالات التي تشترك في نفس الوقت القياسي على هذا الكوكب. يوجد معرف فريد في كل منطقة زمنية ، وكذلك تنسيق منطقة/مدينة (آسيا/طوكيو) ووقت إزاحة يبدأ من زمن غرينتش. على سبيل المثال ، وقت إزاحة طوكيو هو +09: 00.
تحتوي فئة OfficedAteTime فعليًا على LocalDateTime و ZoneOffset. يتم استخدامه للإشارة إلى تاريخ كامل (+06: 00 أو -08: 00) الذي يحتوي على إزاحة وقت غرينويتا (+/- الساعة: نقاط ، مثل +06: 00 أو -08: 00)
يتم استخدام فئة DateTimeFormatter لتنسيق وتحليل التاريخ في Java. على عكس SimpleDateFormat ، فإنه غير متغير وشامل. توفر فئة DateTimeFormatter العديد من التنسيقات المحددة مسبقًا ، ويمكنك أيضًا تخصيص التنسيق الذي تريده. بالطبع ، وفقًا للاتفاقية ، فإنه يحتوي أيضًا على طريقة Parse () لتحويل السلسلة إلى تاريخ. وبالمثل ، فإن فئة DateFormatter لديها أيضًا طريقة تنسيق () لتاريخ التنسيق.
دعنا نقول ، تنسيقان التاريخين من "MMM D YYYY" و "MMM DD Yyyy" يختلفان قليلاً. في "2 يناير 2014" ، سيبلغ الإبلاغ عن خطأ لأنه يتوقع أن تمر حرفين في الشهر. من أجل حل هذه المشكلة ، في حالة عدد الأرقام ، يجب أن تعوض عن 0 في المقدمة.
هذا عن تاريخ الوقت الجديد لجافا 8. هذه الأمثلة الموجزة كافية لفهم بعض واجهات برمجة التطبيقات الجديدة في واجهات برمجة التطبيقات الجديدة هذه. نظرًا لأنه يتم شرحه استنادًا إلى المهمة الفعلية ، عندما يتم مواجهتها في Java ، ليس من الضروري البحث عن الوقت والتاريخ. لقد تعلمنا كيفية إنشاء وتعديل تاريخ الوقت. نتفهم أيضًا الاختلافات بين التاريخ الخالص ، وتاريخ الوقت ، والمنطقة الزمنية للمنطقة الزمنية. هناك عدة أيام في الذكرى السنوية أو يوم التأمين. لقد تعلمنا أيضًا كيفية تحليل وتنسيق التاريخ في طريقة أمان مؤشرات الترابط في Java 8 دون الحاجة إلى استخدام متغير محلي مؤشر ترابط أو مكتبة ثالثة. واجهة برمجة التطبيقات الجديدة مؤهلة لأي مهمة تتعلق بتاريخ الوقت.
إذا كنت مهتمًا أيضًا بالدروس التعليمية Java 8 ، فيمكنك إلقاء نظرة على البرامج التعليمية التالية:
الرابط الأصلي الإنجليزي