سلام! امروز ما کار را با یک نوع داده جدید که قبلاً با آن مواجه نشده بودیم، یعنی تاریخ ها شروع می کنیم. چگونه در زمان گم نشویم - DateTime و Calendar - 1من فکر می کنم نیازی به توضیح نیست که تاریخ چیست :) در اصل، نوشتن تاریخ و زمان فعلی در جاوا کاملاً امکان پذیر است.
public class Main {
   public static void main(String[] args) {

       String date = "June 11, 2018";
       System.out.println(date);
   }
}
اما این روش معایب زیادی دارد. کلاس Stringبرای کار با متن ایجاد شده است و متدهای مناسبی دارد. اگر بخواهیم به نحوی تاریخ را مدیریت کنیم (مثلاً 2 ساعت به آن اضافه کنیم)، Stringاینجا کار نخواهد کرد. یا مثلاً تاریخ و زمان فعلی را در زمان کامپایل شدن برنامه در کنسول نمایش دهید. در اینجا Stringنیز کمکی نمی کند: در حالی که کد را می نویسید و آن را اجرا می کنید، زمان تغییر می کند و نامربوط در کنسول نمایش داده می شود. بنابراین در جاوا سازندگان آن چندین کلاس برای کار با تاریخ و زمان ارائه کردند. اولی کلاس استjava.util.Date

کلاس تاریخ جاوا

ما نام کامل آن را گذاشتیم زیرا یک کلاس در بسته دیگری در جاوا نیز وجود دارد java.sql.Date. گیج نشو! اولین چیزی که باید در مورد آن بدانید این است که تاریخ را بر حسب میلی ثانیه ذخیره می کند که از اول ژانویه 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()که تعداد میلی‌ثانیه‌های گذشته از نیمه‌شب ۱ ژانویه ۱۹۷۰ را برمی‌گرداند. بیایید آن را روی دو شیء Date فراخوانی کنیم و آنها را با یکدیگر مقایسه کنیم:
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
در مثال هایمان، برنامه را به مدت 2 ثانیه در حالت Sleep قرار دادیم تا دو تاریخ متفاوت باشند. در رایانه‌های سریع، زمان بین ایجاد date1و date2می‌تواند کمتر از یک میلی‌ثانیه باشد، در این صورت هر دو و before()و after()برمی‌گردند false. اما روش equals()در چنین شرایطی باز خواهد گشت true! از این گذشته، دقیقاً تعداد میلی ثانیه هایی را که از ساعت 00:00 1 ژانویه 1970 گذشته برای هر تاریخ مقایسه می کند. اشیاء فقط در صورتی برابر در نظر گرفته می شوند که تا میلی ثانیه مطابقت داشته باشند:
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("منسوخ") تعیین شده‌اند. اینجا، نگاه کنید: تاریخ کلاس در اینجا چیزی است که خود سازندگان جاوا در مورد آن بخش از کلاس‌ها می‌گویند که منسوخ شده‌اند: «یک عنصر برنامه مشروح شده با @Deprecated چیزی است که برنامه‌نویسان از استفاده از آن منع می‌شوند، معمولاً به این دلیل که خطرناک است یا به این دلیل که جایگزین بهتری وجود دارد.» این بدان معنا نیست که اصلاً نمی توان از این روش ها استفاده کرد. علاوه بر این، اگر خودتان سعی کنید کد را با استفاده از آنها در IDEA اجرا کنید، به احتمال زیاد کار خواهد کرد. برای مثال روش منسوخ شده را در نظر می گیریم Date.getHours()که تعداد ساعت ها را از شی برمی گرداند Date.
public static void main(String[] args) {

   Date date1 = new Date();

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

}
اگر در زمانی که کد را اجرا می کنید، مثلا ساعت 14:21 باشد، عدد 14 را نمایش می دهد. همانطور که می بینید، روش منسوخ شده خط زده شده است، اما کاملاً خوب کار می کند. این روش‌ها به‌طور کامل حذف نشدند تا دسته‌ای از کدهایی که قبلاً با استفاده از آنها نوشته شده‌اند شکسته نشود. یعنی این روش ها "شکسته" یا "حذف" نیستند، به دلیل در دسترس بودن یک جایگزین راحت تر، به سادگی برای استفاده توصیه نمی شوند. به هر حال، دقیقاً در مستندات در مورد آن نوشته شده است: چگونه در زمان گم نشویم - DateTime و Calendar - 2بیشتر متدهای کلاس Date به نسخه بهبود یافته و توسعه یافته آن - کلاس منتقل شده اند Calendar. بیشتر باهاش ​​آشنا میشیم :)

تقویم جاوا

جاوا 1.1 کلاس جدیدی را معرفی کرد - Calendar. او کار با خرما در جاوا را کمی ساده تر از آنچه قبلاً به نظر می رسید، کرد. تنها پیاده سازی کلاسی 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این است که درک کنید که این یک تقویم است و نه یک تاریخ جداگانه. چگونه در زمان گم نشویم - DateTime و Calendar - 3تاریخ به سادگی مجموعه ای از اعداد است که نشان دهنده یک دوره زمانی خاص است. و تقویم یک دستگاه کامل است که با آن می توانید بسیاری از کارها را با تاریخ انجام دهید :) اگر بخواهید شی 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(). باید فیلدی را که می‌خواهید تغییر دهید، و عدد را به آن منتقل کنید - دقیقاً چقدر می‌خواهید از مقدار فعلی اضافه یا کم کنید. به عنوان مثال، اجازه دهید تاریخ ایجاد شده را به 2 ماه پیش تنظیم کنیم:
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
عالی! ما تاریخ را به 2 ماه پیش تنظیم کرده ایم. در نتیجه نه تنها ماه، بلکه سال نیز از سال 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());
}
ما دقیقاً مانند مثال قبلی انجام دادیم - 2 ماه از تاریخ فعلی کم کردیم. اما اکنون کد متفاوت عمل کرد: ماه از ژانویه به نوامبر تغییر کرد، اما سال مانند سال 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
یعنی علاوه بر "سوپر تنظیم کننده" در کلاس یک Calendar"سوپرگیر" نیز وجود دارد :) نکته جالب دیگر، البته کار با دوره ها است. برای ایجاد یک تاریخ "پیش از میلاد" باید از این فیلد استفاده کنید، Calendar.Era به عنوان مثال، اجازه دهید تاریخی را ایجاد کنیم که نشان دهنده نبرد Cannae است، که در آن هانیبال ارتش رم را شکست داد. این در 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روش ها و ثابت های بیشتری در کلاس وجود دارد، در مورد آنها در مستندات بخوانید:

تبدیل رشته به تاریخ

برای تبدیل رشته به تاریخ، می توانید از کلاس کمکی جاوا - SimpleDateFormat استفاده کنید . این کلاسی است که شما برای تبدیل تاریخ به قالبی که تعریف می کنید نیاز دارید. به نوبه خود، بسیار شبیه به DateFormatچگونه در زمان گم نشویم - DateTime و Calendar - 5 است . تنها تفاوت قابل توجه بین این دو این است که SimpleDateFormat می تواند برای قالب بندی (تبدیل تاریخ به رشته) و تجزیه رشته به تاریخ محلی آگاه استفاده شود، در حالی که DateFormat از محلی پشتیبانی نمی کند. علاوه بر این، DateFormat یک کلاس انتزاعی است که پشتیبانی اولیه را برای قالب‌بندی و تجزیه تاریخ ارائه می‌کند، در حالی که SimpleDateFormat یک کلاس مشخص است که کلاس DateFormat را گسترش می‌دهد. نمونه ای از ایجاد یک شی SimpleDateFormat و قالب بندی یک Date به این صورت است:
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)؛
  • 2 رقم برای ماه (MM)؛
  • 2 رقم برای روز (dd)؛
  • 2 رقم برای ساعت ها در قالب 24 ساعته (HH)؛
  • 2 رقم برای دقیقه (میلی متر)؛
  • 2 رقم برای ثانیه (ss).
علائم جداسازی و ترتیب نمادهای الگو حفظ می شود. خروجی کنسول:
2008-05-30 08:20:12
تعداد زیادی حروف الگو برای کلاس SimpleDateFormat وجود دارد . برای اینکه گیج نشوید آنها را در جدولی جمع آوری کرده ایم:
سمبل شرح مثال
جی دوران (در محلی سازی انگلیسی - بعد از میلاد و قبل از میلاد) آگهی
y سال (عدد 4 رقمی) 2020
yy سال (2 رقم آخر) 20
yyyy سال (عدد 4 رقمی) 2020
م شماره ماه (بدون صفرهای ابتدایی) 8
MM شماره ماه (با صفرهای ابتدایی اگر عدد ماه <10 باشد) 04
MMM مخفف ماه سه حرفی (با توجه به محلی سازی) ژان
MMMM نام کامل ماه ژوئن
w هفته سال (بدون صفرهای ابتدایی) 4
ww هفته سال (با صفرهای ابتدایی) 04
دبلیو هفته در ماه (بدون صفرهای ابتدایی) 3
WW هفته در ماه (با صفر اول) 03
D روز سال 67
د روز ماه (بدون صفرهای ابتدایی) 9
DD روز ماه (با صفرهای ابتدایی) 09
اف روز هفته در ماه (بدون صفرهای ابتدایی) 9
FF روز هفته در ماه (با صفرهای ابتدایی) 09
E روز هفته (مخفف) دبلیو
EEEE روز هفته (کامل) جمعه
تو تعداد روز هفته (بدون صفرهای ابتدایی) 5
uu تعداد روز هفته (با صفرهای ابتدایی) 05
آ نشانگر AM/PM صبح.
اچ ساعت در قالب 24 ساعته بدون صفرهای ابتدایی 6
HH ساعت در قالب 24 ساعته با صفر اول 06
ک تعداد ساعت در قالب 24 ساعته 18
ک تعداد ساعت در قالب 12 ساعت 6
ساعت زمان در قالب 12 ساعت بدون صفرهای ابتدایی 6
هه زمان در قالب 12 ساعته با صفر اول 06
متر دقیقه بدون صفرهای پیشرو 32
میلی متر دقیقه با صفر اول 32
س ثانیه بدون صفرهای ابتدایی یازده
ss ثانیه با صفر اول یازده
اس میلی ثانیه 297
z منطقه زمانی EET
ز منطقه زمانی با فرمت RFC 822 300
نمونه هایی از ترکیب شخصیت های الگو:
نمونه مثال
dd-MM-yyyy 01-11-2020
yyyy-MM-dd 01-10-2019
HH: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 تمام شده است - اجازه دهید به ترجمه رشته جاوا تا به امروز بازگردیم . SimpleDateFormat چنین قابلیت هایی را در اختیار ما قرار می دهد و ما این فرآیند را مرحله به مرحله طی خواهیم کرد.
  1. خطی ایجاد کنید که باید تاریخ را از آن تعیین کنید:

    String strDate = "Sat, April 4, 2020";
  2. ما یک شی SimpleDateFormat جدید با الگویی ایجاد می کنیم که با آنچه در رشته داریم مطابقت دارد (در غیر این صورت نمی توانیم آن را تجزیه کنیم):

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

    همانطور که می بینید، ما در اینجا یک آرگومان Locale داریم. اگر آن را حذف کنیم، از Locale پیش فرض استفاده می کند که همیشه انگلیسی نیست.

    اگر زبان محلی با رشته ورودی مطابقت نداشته باشد، داده‌های رشته‌ای که به زبان متصل شده‌اند، مانند دوشنبه یا آوریل ما ، شناسایی نمی‌شوند و یک 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 و Calendar

SimpleDateFormat به شما امکان می دهد تمام اشیاء تاریخ و تقویمی را که ایجاد می کنید برای استفاده بعدی قالب بندی کنید. بیایید یک نکته جالب مانند کار با دوره ها را در نظر بگیریم. برای ایجاد تاریخ "پیش از میلاد"، باید از فیلد Calendar.Era استفاده کنید. به عنوان مثال، اجازه دهید تاریخی را ایجاد کنیم که نشان دهنده نبرد Cannae باشد، که در آن هانیبال ارتش رم را شکست داد. این در 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
خیلی بهتره، درسته؟ :)