JavaRush /مدونة جافا /Random-AR /كيف لا تضيع في الوقت المناسب - DateTime والتقويم

كيف لا تضيع في الوقت المناسب - DateTime والتقويم

نشرت في المجموعة
مرحبًا! سنبدأ اليوم العمل بنوع بيانات جديد لم نواجهه من قبل، وهو التواريخ. كيف لا تضيع في الوقت المناسب - التاريخ والوقت والتقويم - 1أعتقد أنه ليست هناك حاجة لشرح ما هو التاريخ :) من حيث المبدأ، من الممكن تمامًا كتابة التاريخ والوقت الحاليين في Java في سلسلة عادية.
public class Main {
   public static void main(String[] args) {

       String date = "June 11, 2018";
       System.out.println(date);
   }
}
لكن هذا النهج له عيوب كثيرة. تم إنشاء الفصل Stringللعمل مع النص، وله الأساليب المناسبة. إذا أردنا إدارة التاريخ بطريقة أو بأخرى (أضف إليه ساعتين، على سبيل المثال)، فلن Stringيعمل هنا. أو، على سبيل المثال، قم بعرض التاريخ والوقت الحاليين في وقت تجميع البرنامج في وحدة التحكم. لن يساعد ذلك هنا Stringأيضًا: أثناء كتابة الكود وتشغيله، سيتغير الوقت وسيتم عرض العناصر غير ذات الصلة في وحدة التحكم. لذلك، في Java، قدم منشئوها عدة فئات للعمل مع التواريخ والأوقات. الأول هو الطبقةjava.util.Date

فئة تاريخ جافا

لقد أعطيناها اسمها الكامل نظرًا لوجود فئة أيضًا في حزمة أخرى في Java java.sql.Date. لا تخلط! أول شيء يجب أن تعرفه عنه هو أنه يخزن التاريخ بالمللي ثانية التي مرت منذ 1 يناير 1970. حتى أن هناك اسمًا منفصلاً لهذا التاريخ - "توقيت يونكس" إنها طريقة مثيرة للاهتمام، ألا توافقني على ذلك؟ :) الشيء الثاني الذي يجب تذكره: إذا قمت بإنشاء كائن Dateباستخدام مُنشئ فارغ، فستكون النتيجة هي التاريخ والوقت الحاليين في وقت إنشاء الكائن . Stringهل تتذكر كيف كتبنا أن مثل هذه المهمة ستكون مشكلة بالنسبة لتنسيق التاريخ ؟ الفصل Dateيحلها بسهولة.
public class Main {
   public static void main(String[] args) {

       Date date = new Date();
       System.out.println(date);
   }
}
قم بتشغيل هذا الرمز عدة مرات وسترى كيف سيتغير الوقت في كل مرة :) هذا ممكن على وجه التحديد لأنه يتم تخزينه بالمللي ثانية: إنها أصغر وحدة زمنية، ولهذا السبب تكون النتائج دقيقة للغاية. يوجد مُنشئ آخر لـ Date: يمكنك تحديد العدد الدقيق للميلي ثانية التي مرت من 00:00 1 يناير 1970 إلى التاريخ المطلوب، وسيتم إنشاؤه:
public class Main {
   public static void main(String[] args) {

       Date date = new Date(1212121212121L);
       System.out.println(date);
   }
}
إخراج وحدة التحكم:

Fri May 30 08:20:12 MSD 2008
وصلنا في 30 مايو 2008. "الجمعة" تعني يوم الأسبوع - "الجمعة" (الجمعة)، وMSD - "التوقيت الصيفي لموسكو" (توقيت موسكو الصيفي). يتم إرسال المللي ثانية بالتنسيق long، نظرًا لأن عددها لا يتناسب في أغلب الأحيان int. إذًا، ما نوع عمليات التاريخ التي قد نحتاجها في عملنا؟ حسنًا، الأمر الأكثر وضوحًا بالطبع هو المقارنة . حدد ما إذا كان أحد التاريخين أحدث أم أقدم من الآخر. يمكن القيام بذلك بطرق مختلفة. على سبيل المثال، يمكنك استدعاء الطريقة . Date.getTime()، والتي ستعيد عدد المللي ثانية التي مرت منذ منتصف ليل الأول من يناير عام 1970. دعنا نسميها كائنين من كائنات التاريخ ونقارنهما ببعضهما البعض:
public class Main {
   public static void main(String[] args) {

       Date date1 = new Date();

       Date date2 = new Date();

       System.out.println((date1.getTime() > date2.getTime())?
               "date1 is later than date2" : "date1 is earlier than date2");
   }
}
خاتمة:

date1 раньше date2
ولكن هناك طريقة أكثر ملاءمة، وهي استخدام أساليب خاصة للفئة Date: before()و . كلهم يعيدون النتيجة في . تتحقق الطريقة مما إذا كان تاريخنا أقدم من التاريخ الذي نمرره كوسيطة: after()equals()booleanbefore()
public class Main {
   public static void main(String[] args) throws InterruptedException {

       Date date1 = new Date();

       Thread.sleep(2000);//pause the program for 2 seconds
       Date date2 = new Date();

       System.out.println(date1.before(date2));
   }
}
إخراج وحدة التحكم:

true
تعمل الطريقة بطريقة مشابهة after()؛ فهي تتحقق مما إذا كان تاريخنا أحدث من التاريخ الذي نمرره كوسيطة:
public class Main {
   public static void main(String[] args) throws InterruptedException {

       Date date1 = new Date();

       Thread.sleep(2000);//pause the program for 2 seconds
       Date date2 = new Date();

       System.out.println(date1.after(date2));
   }
}
إخراج وحدة التحكم:

false
في الأمثلة التي لدينا، قمنا بوضع البرنامج في وضع السكون لمدة ثانيتين بحيث نضمن اختلاف التاريخين. على أجهزة الكمبيوتر السريعة، يمكن أن يكون الوقت بين الإنشاء date1و date2أقل من مللي ثانية واحدة، وفي هذه الحالة سترجع كلتا before()الطريقتين . لكن الطريقة في مثل هذه الحالة ستعود ! ففي النهاية، فهو يقارن بالضبط عدد المللي ثانية التي مرت منذ الساعة 00:00 في الأول من يناير عام 1970 لكل تاريخ. لن يتم اعتبار الكائنات متساوية إلا إذا كانت متطابقة حتى المللي ثانية: after()falseequals()true
public static void main(String[] args) {

   Date date1 = new Date();
   Date date2 = new Date();

   System.out.println(date1.getTime());
   System.out.println(date2.getTime());

   System.out.println(date1.equals(date2));
}
إليك شيء آخر عليك الانتباه إليه. إذا قمت بفتح وثائق الفصل الدراسي Dateعلى موقع Oracle الإلكتروني، فسترى أن العديد من أساليبه ومنشئاته قد تم تصنيفها Deprecated("مهملة"). هنا، انظر: تاريخ الفصل إليك ما يقوله منشئو Java أنفسهم عن تلك الأجزاء من الفئات التي أصبحت مهملة: "عنصر البرنامج المشروح بـ @Deprecated هو شيء لا يُنصح المبرمجون باستخدامه، عادةً لأنه خطير، أو لأن ذلك هناك بديل أفضل." هذا لا يعني أنه لا يمكن استخدام هذه الأساليب على الإطلاق. علاوة على ذلك، إذا حاولت بنفسك تشغيل التعليمات البرمجية باستخدامها في IDEA، فمن المرجح أن تعمل، لنأخذ على سبيل المثال الطريقة المهملة Date.getHours()، التي تُرجع عدد الساعات من الكائن Date.
public static void main(String[] args) {

   Date date1 = new Date();

   System.out.println(date1.getHours());

}
إذا كان الوقت في وقت تشغيل الكود، على سبيل المثال، هو 14:21، فسيعرض الرقم 14. كما ترون، تم شطب الطريقة المهملة، ولكنها تعمل بشكل جيد. لم تتم إزالة هذه الأساليب بالكامل، حتى لا يتم كسر مجموعة من التعليمات البرمجية المكتوبة بالفعل باستخدامها. وهذا هو، هذه الأساليب ليست "مكسورة" أو "إزالة"، فهي ببساطة لا ينصح باستخدامها بسبب وجود بديل أكثر ملاءمة. بالمناسبة، تم كتابته مباشرة في الوثائق: كيف لا تضيع في الوقت المناسب - التاريخ والوقت والتقويم - 2تم نقل معظم أساليب فئة Date إلى نسختها المحسنة والموسعة - الفئة Calendar. وسنتعرف عليه أكثر :)

تقويم جافا

قدم Java 1.1 فئة جديدة - Calendar. لقد جعل العمل مع التواريخ في Java أسهل قليلاً مما كان يبدو من قبل. التنفيذ الوحيد للفصل Calendarالذي سنعمل به هو الفصل GregorianCalendar(يطبق التقويم الغريغوري الذي تعيش بموجبه معظم دول العالم). الميزة الرئيسية هي أنه يمكنه العمل مع التواريخ بتنسيق أكثر ملاءمة. على سبيل المثال، يمكنه:
  • أضف شهرًا أو يومًا إلى التاريخ الحالي
  • التحقق مما إذا كانت السنة سنة كبيسة؛
  • الحصول على مكونات التاريخ الفردية (على سبيل المثال، الحصول على رقم الشهر من تاريخ كامل)
  • وأيضًا تم تطوير نظام مناسب جدًا من الثوابت بداخله (سنرى الكثير منها أدناه).
هناك اختلاف مهم آخر في الفصل Calendarوهو أنه يطبق ثابتًا Calendar.Era: يمكنك ضبط التاريخ على العصر قبل الميلاد ("قبل المسيح" - قبل ميلاد المسيح، أي "قبل عصرنا") أو AC ("بعد المسيح" - " عصرنا"). دعونا ننظر إلى كل هذا مع الأمثلة. لنقم بإنشاء تقويم بتاريخ 25 يناير 2017:
public static void main(String[] args) {

  Calendar calendar = new GregorianCalendar(2017, 0 , 25);
}
تبدأ الأشهر في الفصل Calendar(بالمناسبة Date) من الصفر، لذلك مررنا الرقم 0 باعتباره الوسيط الثاني. الشيء الرئيسي عند العمل مع الفصل Calendarهو أن تفهم أن هذا تقويم وليس تاريخًا منفصلاً. كيف لا تضيع في الوقت المناسب - التاريخ والوقت والتقويم - 3التاريخ هو ببساطة سلسلة من الأرقام تمثل فترة زمنية محددة. والتقويم عبارة عن جهاز كامل يمكنك من خلاله القيام بالكثير من الأشياء بالتواريخ :) يمكن رؤية ذلك بوضوح تام إذا حاولت إخراج كائن التقويم إلى وحدة التحكم: الإخراج:

java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Moscow",offset=10800000,dstSavings=0,useDaylight=false,transitions=79,lastRule=null],firstDayOfWeek=2,minimalDaysInFirstWeek=1,ERA=?,YEAR=2017,MONTH=0,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=25,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=?,ZONE_OFFSET=?,DST_OFFSET=?]
انظر كم من المعلومات هناك! يحتوي التقويم على مجموعة من الخصائص التي لا تحتوي على تاريخ عادي، ويتم إخراجها جميعًا إلى وحدة التحكم (هذه هي الطريقة التي تعمل بها الطريقة toString()في الفصل Calendar). إذا، عند العمل، تحتاج فقط إلى الحصول على تاريخ بسيط من التقويم، أي. كائن Date- يتم ذلك باستخدام إحدى الطرق Calendar.getTime()(الاسم ليس هو الأكثر منطقية، ولكن لا يمكن فعل أي شيء):
public static void main(String[] args) {

   Calendar calendar = new GregorianCalendar(2017, 0 , 25);
   Date date = calendar.getTime();
   System.out.println(date);
}
خاتمة:

Wed Jan 25 00:00:00 MSK 2017
الآن قمنا "بتبسيط" التقويم إلى تاريخ منتظم. هيا لنذهب. بالإضافة إلى الرموز الرقمية للأشهر، Calendarيمكن استخدام الثوابت في الفصل الدراسي. الثوابت هي حقول ثابتة لفئة Calendarذات قيمة محددة بالفعل ولا يمكن تغييرها. هذا الخيار هو في الواقع أفضل، لأنه يحسن إمكانية قراءة التعليمات البرمجية.
public static void main(String[] args) {
   GregorianCalendar calendar = new GregorianCalendar(2017, Calendar.JANUARY , 25);
}
Calendar.JANUARY- أحد الثوابت لبيان الشهر. مع خيار التسمية هذا، لن ينسى أحد، على سبيل المثال، أن الرقم "3" يعني أبريل، وليس الشهر الثالث الذي اعتدنا عليه - مارس. أنت فقط تكتب Calendar.APRIL- وهذا كل شيء :) يمكن ضبط جميع حقول التقويم (اليوم والشهر والدقائق والثواني وما إلى ذلك) بشكل فردي باستخدام الطريقة set(). إنه مناسب جدًا، نظرًا لأن Calendarكل حقل له ثابت خاص به في الفصل، وسيبدو الكود النهائي بسيطًا قدر الإمكان. على سبيل المثال، في المثال السابق، قمنا بإنشاء تاريخ، ولكن لم نقم بتعيين الوقت الحالي له. لنضبط الوقت على 19:42:12
public static void main(String[] args) {
   Calendar calendar = new GregorianCalendar();
   calendar.set(Calendar.YEAR, 2017);
   calendar.set(Calendar.MONTH, 0);
   calendar.set(Calendar.DAY_OF_MONTH, 25);
   calendar.set(Calendar.HOUR_OF_DAY, 19);
   calendar.set(Calendar.MINUTE, 42);
   calendar.set(Calendar.SECOND, 12);

   System.out.println(calendar.getTime());
}
خاتمة:

Wed Jan 25 19:42:12 MSK 2017
نسمي الطريقة set()ونمرر لها ثابتًا (حسب الحقل الذي نريد تغييره) وقيمة جديدة لهذا الحقل. اتضح أن هذه الطريقة set()هي نوع من "الضبط الفائق" الذي يمكنه تعيين قيمة ليس لحقل واحد، ولكن للعديد من الحقول :) تتم إضافة وطرح القيم في الفصل Calendarباستخدام add(). تحتاج إلى تمرير الحقل الذي تريد تغييره إليه، والرقم - بالضبط المبلغ الذي تريد إضافته/طرحه من القيمة الحالية. على سبيل المثال، لنعيد التاريخ الذي أنشأناه إلى ما قبل شهرين:
public static void main(String[] args) {
   Calendar calendar = new GregorianCalendar(2017, Calendar.JANUARY , 25);
   calendar.set(Calendar.HOUR, 19);
   calendar.set(Calendar.MINUTE, 42);
   calendar.set(Calendar.SECOND, 12);

   calendar.add(Calendar.MONTH, -2);//to subtract a value - a negative number must be passed to the method
   System.out.println(calendar.getTime());
}
خاتمة:

Fri Nov 25 19:42:12 MSK 2016
عظيم! لقد قمنا بتعيين التاريخ إلى ما قبل شهرين. ونتيجة لذلك، لم يتغير الشهر فحسب، بل تغير العام أيضًا، من 2017 إلى 2016. وبطبيعة الحال، يتم حساب السنة الحالية عند نقل التواريخ تلقائيًا ولا يلزم التحكم فيها يدويًا. ولكن إذا كنت بحاجة إلى تعطيل هذا السلوك لسبب ما، فيمكنك القيام بذلك. هناك طريقة خاصة roll()يمكنها إضافة وطرح القيم دون التأثير على القيم الأخرى. على سبيل المثال، مثل هذا:
public static void main(String[] args) {
   Calendar calendar = new GregorianCalendar(2017, Calendar.JANUARY , 25);
   calendar.set(Calendar.HOUR, 10);
   calendar.set(Calendar.MINUTE, 42);
   calendar.set(Calendar.SECOND, 12);

   calendar.roll(Calendar.MONTH, -2);
   System.out.println(calendar.getTime());
}
لقد فعلنا نفس الشيء تمامًا كما في المثال السابق، حيث طرحنا شهرين من التاريخ الحالي. ولكن الآن أصبح الرمز يعمل بشكل مختلف: تغير الشهر من يناير إلى نوفمبر، لكن العام ظل كما هو في عام 2017! خاتمة:

Sat Nov 25 10:42:12 MSK 2017
إضافي. Calendarكما قلنا أعلاه، يمكن الحصول على جميع حقول الكائن بشكل منفصل. الطريقة هي المسؤولة عن هذا get():
public static void main(String[] args) {
   GregorianCalendar calendar = new GregorianCalendar(2017, Calendar.JANUARY , 25);
   calendar.set(Calendar.HOUR, 10);
   calendar.set(Calendar.MINUTE, 42);
   calendar.set(Calendar.SECOND, 12);

   System.out.println("Year: " + calendar.get(Calendar.YEAR));
   System.out.println("Month: " + calendar.get(Calendar.MONTH));
   System.out.println("Number of the week in the month: " + calendar.get(Calendar.WEEK_OF_MONTH));// serial number of the week in the month

   System.out.println("Number: " + calendar.get(Calendar.DAY_OF_MONTH));

   System.out.println("Watch: " + calendar.get(Calendar.HOUR));
   System.out.println("Minutes: " + calendar.get(Calendar.MINUTE));
   System.out.println("Seconds: " + calendar.get(Calendar.SECOND));
   System.out.println("Milliseconds: " + calendar.get(Calendar.MILLISECOND));

}
خاتمة:

Год: 2017 
Месяц: 0 
Порядковый номер недели в месяце: 4 
Число: 25 
Часы: 10 
Минуты: 42 
Секунды: 12 
Миллисекунды: 0
وهذا هو، بالإضافة إلى "Super-Setter" في الفصل، Calendarهناك أيضا "Super-Getter" :) هناك نقطة أخرى مثيرة للاهتمام، بالطبع، العمل مع العصور. لإنشاء تاريخ "قبل الميلاد" تحتاج إلى استخدام الحقل. Calendar.Era على سبيل المثال، لنقم بإنشاء تاريخ يشير إلى معركة كاناي، التي هزم فيها حنبعل جيش روما. حدث هذا في 2 أغسطس 216 قبل الميلاد. ه.:
public static void main(String[] args) {
   GregorianCalendar cannes = new GregorianCalendar(216, Calendar.AUGUST, 2);
   cannes.set(Calendar.ERA, GregorianCalendar.BC);

   DateFormat df = new SimpleDateFormat("dd MMM yyy GG");
   System.out.println(df.format(cannes.getTime()));
}
استخدمنا هنا الفصل SimpleDateFormatلعرض التاريخ بتنسيق أكثر قابلية للفهم بالنسبة لنا (الأحرف "GG" هي المسؤولة عن عرض العصر). خاتمة:

02 авг 216 до н.э.
Calendarهناك العديد من التوابع والثوابت في الفصل ، اقرأ عنها في الوثائق:

تحويل السلسلة إلى التاريخ

لتحويل سلسلة إلى تاريخ، يمكنك استخدام فئة مساعد Java - SimpleDateFormat . هذا هو الفصل الذي تحتاجه لتحويل التاريخ إلى التنسيق الذي تحدده. كيف لا تضيع في الوقت المناسب - التاريخ والوقت والتقويم - 5وهو بدوره مشابه جدًا لـ DateFormat . والفرق الوحيد الملحوظ بين الاثنين هو أنه يمكن استخدام SimpleDateFormat للتنسيق (تحويل تاريخ إلى سلسلة) وتحليل السلسلة إلى تاريخ مدرك للإعدادات المحلية، في حين أن DateFormat لا يدعم الإعدادات المحلية. بالإضافة إلى ذلك، فإن DateFormat عبارة عن فئة مجردة توفر الدعم الأساسي لتنسيق التواريخ وتحليلها، في حين أن SimpleDateFormat عبارة عن فئة ملموسة تعمل على توسيع فئة DateFormat. هذا ما يبدو عليه مثال إنشاء كائن SimpleDateFormat وتنسيق التاريخ:
SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(1212121212121L);

System.out.println(formatter.format(date));
في المثال أعلاه استخدمنا النمط "yyyy-MM-dd HH:mm:ss" والذي يعني:
  • 4 أرقام للسنة (yyyy)؛
  • رقمين للشهر (مم)؛
  • رقمان لليوم (dd)؛
  • رقمان للساعات بتنسيق 24 ساعة (HH)؛
  • رقمان للدقائق (مم)؛
  • رقمين للثواني (ss).
يتم الحفاظ على علامات الفصل وترتيب رموز النمط. إخراج وحدة التحكم:
2008-05-30 08:20:12
يوجد عدد كبير جدًا من أحرف القوالب لفئة SimpleDateFormat . وحتى لا تحتاروا فقد جمعناها في جدول:
رمز وصف مثال
ز العصر (بالترجمة الإنجليزية - ميلادي وقبل الميلاد) إعلان
ذ السنة (رقم مكون من 4 أرقام) 2020
yy السنة (آخر رقمين) 20
yyyy السنة (رقم مكون من 4 أرقام) 2020
م رقم الشهر (بدون الأصفار البادئة) 8
مم رقم الشهر (مع الأصفار البادئة إذا كان رقم الشهر أقل من 10) 04
ط ط ط اختصار الشهر من ثلاثة أحرف (حسب الترجمة) يناير
ط ط ط ط اسم الشهر كاملا يونيو
ث الأسبوع من السنة (بدون الأصفار البادئة) 4
رطب الأسبوع من السنة (مع الأصفار البادئة) 04
دبليو أسبوع في شهر (بدون الأصفار البادئة) 3
WW أسبوع في شهر (مع صفر بادئ) 03
د يوم من السنة 67
د يوم من الشهر (بدون الأصفار البادئة) 9
د يوم من الشهر (مع الأصفار البادئة) 09
F يوم من الأسبوع في الشهر (بدون الأصفار البادئة) 9
FF يوم من الأسبوع في الشهر (مع الأصفار البادئة) 09
ه يوم من أيام الأسبوع (اختصار) دبليو
إيي يوم من الأسبوع (كامل) جمعة
ش رقم يوم الأسبوع (بدون الأصفار البادئة) 5
ش رقم يوم الأسبوع (مع الأصفار البادئة) 05
أ علامة صباحا/مساءا أكون.
ح ساعات بتنسيق 24 ساعة بدون أصفار بادئة 6
ح ح الساعة بتنسيق 24 ساعة مع صفر بادئ 06
ك عدد الساعات بصيغة 24 ساعة 18
ك عدد الساعات بصيغة 12 ساعة 6
ح الوقت بتنسيق 12 ساعة بدون أصفار بادئة 6
ح ح الوقت بتنسيق 12 ساعة مع صفر بادئ 06
م دقائق بدون أصفار بادئة 32
مم دقائق مع الصفر البادئ 32
س ثواني بدون أصفار بادئة أحد عشر
سس ثانية مع الصفر البادئ أحد عشر
س ميلي ثانية 297
ض وحدة زمنية EET
ز المنطقة الزمنية بتنسيق RFC 822 300
أمثلة على مجموعات أحرف النمط:
عينة مثال
يوم-شهر-س س س س 01-11-2020
س س س-ش-ي ي 2019-10-01
سمو:mm:ss.SSS 23:59.59.999
yyyy-MM-dd HH:mm:ss 2018-11-30 03:09:02
yyyy-MM-dd HH:mm:ss.SSS 2016-03-01 01:20:47.999
yyyy-MM-dd HH:mm:ss.SSS Z 2013-13-13 23:59:59.999 +0100
إذا ارتكبت خطأً بسيطًا في التنسيق، فيمكنك أن تصبح مالكًا لـ java.text.ParseException، وهذا ليس إنجازًا ممتعًا بشكل خاص. حسنًا، انتهت الرحلة القصيرة إلى SimpleDateFormat - دعنا نعود إلى ترجمة سلسلة Java حتى الآن . يمنحنا SimpleDateFormat مثل هذه الإمكانيات، وسنتناول هذه العملية خطوة بخطوة.
  1. قم بإنشاء سطر تريد تحديد التاريخ منه:

    String strDate = "Sat, April 4, 2020";
  2. نقوم بإنشاء كائن SimpleDateFormat جديد باستخدام قالب يطابق ما لدينا في السلسلة (وإلا فلن نتمكن من تحليله):

    SimpleDateFormat formatter = new SimpleDateFormat("EEE, MMMM d, yyyy", Locale.ENGLISH);

    كما ترون، لدينا وسيطة لغة هنا. إذا حذفناها، فسوف نستخدم اللغة الافتراضية، وهي ليست الإنجليزية دائمًا.

    إذا كانت اللغة لا تتطابق مع سلسلة الإدخال، فلن يتم التعرف على بيانات السلسلة المرتبطة باللغة، مثل بياناتنا Mon أو April ، وستطرح java.text.ParseException، حتى لو كان النمط متطابقًا.

    ومع ذلك، لا يتعين علينا تحديد التنسيق إذا كنا نستخدم قالبًا غير خاص باللغة. كمثال - yyyy-MM-dd HH:mm:ss

  3. نقوم بإنشاء تاريخ باستخدام المُنسق، والذي بدوره يقوم بتحليله من سلسلة الإدخال:

    try {
      Date date = formatter.parse(strDate);
      System.out.println(date);
    }
    catch (ParseException e) {
      e.printStackTrace();
    }

    إخراج وحدة التحكم:

    
    Sat Apr 04 00:00:00 EEST 2020

    هممم... لكن الشكل لم يعد هو نفسه!

    لعمل نفس التنسيق، نستخدم المنسق مرة أخرى:

    System.out.println(formatter.format(date));

    إخراج وحدة التحكم:

    
    Sat, April 4, 2020

SimpleDateFormat والتقويم

يسمح لك SimpleDateFormat بتنسيق جميع كائنات التاريخ والتقويم التي تقوم بإنشائها لاستخدامها لاحقًا. دعونا نفكر في نقطة مثيرة للاهتمام مثل العمل مع العصور. لإنشاء تاريخ "BC"، تحتاج إلى استخدام حقل Calendar.Era. على سبيل المثال، لنقم بإنشاء تاريخ يشير إلى معركة كاناي، التي هزم فيها حنبعل جيش روما. حدث هذا في 2 أغسطس 216 قبل الميلاد. ه.:
public static void main(String[] args) {
   GregorianCalendar cannes = new GregorianCalendar(216, Calendar.AUGUST, 2);
   cannes.set(Calendar.ERA, GregorianCalendar.BC);

   DateFormat df = new SimpleDateFormat("dd MMM yyy GG");
   System.out.println(df.format(cannes.getTime()));
}
استخدمنا هنا فئة SimpleDateFormat لعرض التاريخ بتنسيق أكثر قابلية للفهم بالنسبة لنا (كما هو موضح أعلاه، فإن الحروف "GG" هي المسؤولة عن عرض العصر). خاتمة:

02 авг 216 до н.э.

تنسيق تاريخ جافا

وهنا حالة أخرى. لنفترض أن تنسيق التاريخ هذا لا يناسبنا:

Sat Nov 25 10:42:12 MSK 2017
حتى هنا هو عليه. باستخدام إمكانياتنا في تنسيق تاريخ جافا، يمكنك تغييره إلى تنسيقك الخاص دون صعوبة كبيرة:
public static void main(String[] args) {

   SimpleDateFormat dateFormat = new SimpleDateFormat("EEEE, d MMMM yyyy");
   Calendar calendar = new GregorianCalendar(2017, Calendar.JANUARY , 25);
   calendar.set(Calendar.HOUR, 10);
   calendar.set(Calendar.MINUTE, 42);
   calendar.set(Calendar.SECOND, 12);

   calendar.roll(Calendar.MONTH, -2);
   System.out.println(dateFormat.format(calendar.getTime()));
}
خاتمة:

суббота, 25 Ноябрь 2017
أفضل بكثير، أليس كذلك؟ :)
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION