مرحبًا! سنبدأ اليوم العمل بنوع بيانات جديد لم نواجهه من قبل، وهو التواريخ. أعتقد أنه ليست هناك حاجة لشرح ما هو التاريخ :) من حيث المبدأ، من الممكن تمامًا كتابة التاريخ والوقت الحاليين في Java في سلسلة عادية.
أمثلة على مجموعات أحرف النمط:
إذا ارتكبت خطأً بسيطًا في التنسيق، فيمكنك أن تصبح مالكًا لـ java.text.ParseException، وهذا ليس إنجازًا ممتعًا بشكل خاص. حسنًا، انتهت الرحلة القصيرة إلى SimpleDateFormat - دعنا نعود إلى ترجمة سلسلة Java حتى الآن . يمنحنا SimpleDateFormat مثل هذه الإمكانيات، وسنتناول هذه العملية خطوة بخطوة.
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
فئة تاريخ جافا
لقد أعطيناها اسمها الكامل نظرًا لوجود فئة أيضًا في حزمة أخرى في Javajava.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()
boolean
before()
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()
false
equals()
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. كما ترون، تم شطب الطريقة المهملة، ولكنها تعمل بشكل جيد. لم تتم إزالة هذه الأساليب بالكامل، حتى لا يتم كسر مجموعة من التعليمات البرمجية المكتوبة بالفعل باستخدامها. وهذا هو، هذه الأساليب ليست "مكسورة" أو "إزالة"، فهي ببساطة لا ينصح باستخدامها بسبب وجود بديل أكثر ملاءمة. بالمناسبة، تم كتابته مباشرة في الوثائق: تم نقل معظم أساليب فئة 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
هو أن تفهم أن هذا تقويم وليس تاريخًا منفصلاً. التاريخ هو ببساطة سلسلة من الأرقام تمثل فترة زمنية محددة. والتقويم عبارة عن جهاز كامل يمكنك من خلاله القيام بالكثير من الأشياء بالتواريخ :) يمكن رؤية ذلك بوضوح تام إذا حاولت إخراج كائن التقويم إلى وحدة التحكم: الإخراج:
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 . هذا هو الفصل الذي تحتاجه لتحويل التاريخ إلى التنسيق الذي تحدده. وهو بدوره مشابه جدًا لـ 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 |
-
قم بإنشاء سطر تريد تحديد التاريخ منه:
String strDate = "Sat, April 4, 2020";
-
نقوم بإنشاء كائن SimpleDateFormat جديد باستخدام قالب يطابق ما لدينا في السلسلة (وإلا فلن نتمكن من تحليله):
SimpleDateFormat formatter = new SimpleDateFormat("EEE, MMMM d, yyyy", Locale.ENGLISH);
كما ترون، لدينا وسيطة لغة هنا. إذا حذفناها، فسوف نستخدم اللغة الافتراضية، وهي ليست الإنجليزية دائمًا.
إذا كانت اللغة لا تتطابق مع سلسلة الإدخال، فلن يتم التعرف على بيانات السلسلة المرتبطة باللغة، مثل بياناتنا Mon أو April ، وستطرح java.text.ParseException، حتى لو كان النمط متطابقًا.
ومع ذلك، لا يتعين علينا تحديد التنسيق إذا كنا نستخدم قالبًا غير خاص باللغة. كمثال - yyyy-MM-dd HH:mm:ss
-
نقوم بإنشاء تاريخ باستخدام المُنسق، والذي بدوره يقوم بتحليله من سلسلة الإدخال:
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
أفضل بكثير، أليس كذلك؟ :)
GO TO FULL VERSION