Java SimpleDateFormat – פורמט תאריך Java

הקדמה

מחלקות SimpleDateFormat ו־DateFormat ב־Java משמשות לעיצוב תאריכים. נהוג להשתמש בהן בעיקר כאשר נדרש להציג או להשתמש בפונקציות תאריך ושעה ב־Java. שתי המחלקות הללו קיימות בחבילת com.text.

מחלקת DateFormat ב־Java

  • DateFormat משמשת לעיצוב תאריך לתווים מסוימים בהתאם לאזור מסוים המסופק כקלט.
  • האזור משמש לציון האזור והשפה כדי להפוך את הקוד לפתוח יותר למשתמש.
  • האופן שבו נכתב תאריך שונה באזורים שונים בעולם. לדוגמה, 31 בדצמבר 2017 ייכתב בהודו כ־31-12-2017, אך אותו הדבר ייכתב בארצות הברית כ־12-31-2017.
  • מחלקות DateFormat אינן מסונכרנות, ומומלץ ליצור מופע נפרד עבור כל תהליך.

A DateFormat object can be created using the getDateInstance() and getTimeInstance() method of the DateFormat class.

Locale loc = new Locale("en", "US");
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.DEFAULT, loc);

הערה: בנאי ה־Locale(String, String) נפסל מגרסה 19 והלאה.

Locale loc = new Locale.Builder().setLanguage("en").setRegion("US").build();

השיטה getDateInstance של DateFormat דורשת שני פרמטרים קלט. הפרמטר הראשון מציין את ה-DateFormat שיש להשתמש בו והפרמטר השני הוא האזור.

בשימוש format

המחלקה DateFormat מכילה שיטת format אשר אחראית לעיצוב.

Locale locale = new Locale("fr", "FR");
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.DEFAULT, locale);
String date = dateFormat.format(new Date());
System.out.print(date);

קטע קוד זה יעצב את התאריך בשפה הצרפתית (fr) ובאזור צרפת (FR):

Output
3 janv. 2018

בשימוש getTimeInstance()

ליצירת מופע של DateFormat אנו משתמשים בשיטת getDateInstance().

עבור עיצוב זמן, נזקק למופע של זמן. נשתמש בשיטת getTimeInstance() לקבלת מופע של זמן.

Locale locale = new Locale("fr", "FR");
DateFormat dateFormat = DateFormat.getTimeInstance(DateFormat.DEFAULT, locale);
String date = dateFormat.format(new Date());
System.out.print(date);

קטע קוד זה יעצב את הזמן בשפה הצרפתית (fr) ובאזור צרפת (FR):

Output
11:03:01

Java SimpleDateFormat

SimpleDateFormat דומה ל־DateFormat. ההבחנה המרכזית היחידה ביניהם היא ש־SimpleDateFormat ניתן לשימוש לפירמוטינג (המרת Date ל־String) ולפירסינג (String ל־Date המרה) עם תמיכה בלוקלייז, כאשר DateFormat אין לו תמיכה בלוקלייז. DateFormat הוא מחלקה אבסטרקטית המספקת תמיכה בסיסית לפירמוט ולפירסינג של תאריכים. SimpleDateFormat היא המחלקה הקונקרטית שמרחיבה את מחלקת DateFormat.

SimpleDateFormat ניתן ליצירה באמצעות בנאי של SimpleDateFormat. הבנאי הוא בנאי ממותג ודורש דפוס String כפרמטר.

String pattern = "MM-dd-yyyy";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);

המחרוזת pattern היא התבנית שתשמש לפירמוט של תאריך והפלט יופיע באותה התבנית כמו "‏MM-dd-yyyy".

תבניות

בואו נסתכל על תחביר התבנית שצריכה להיות בשימוש לפירמוט.

Letter for Pattern Date or Time component Examples
G Era designator AD
y Year 2018 (yyyy), 18 (yy)
M Month in year July (MMMM), Jul (MMM), 07 (MM)
w Results in week in year 16
W Results in week in month 3
D Gives the day count in the year 266
d Day of the month 09 (dd), 9(d)
F Day of the week in month 4
E Day name in the week Tuesday, Tue
u Day number of week where 1 represents Monday, 2 represents Tuesday and so on 2
a AM or PM marker AM
H Hour in the day (0-23) 12
k Hour in the day (1-24) 23
K Hour in am/pm for 12 hour format (0-11) 0
h Hour in am/pm for 12 hour format (1-12) 12
m Minute in the hour 59
s Second in the minute 35
S Millisecond in the minute 978
z Timezone Pacific Standard Time; PST; GMT-08:00
Z Timezone offset in hours (RFC pattern) -0800
X Timezone offset in ISO format -08; -0800; -08:00

יש להשתמש באותיות שונות בכמות שונה לתוצאות שונות, לדוג, לחודש:

Type Pattern Example Output
Full Month MMMM July
Abbreviated Month MMM Jul
Numeric Month MM 07

דוגמאות

בואו נבחן כעת כמה דוגמאות לפורמטים שונים של תאריך ושעה.

Pattern Result
MM/dd/yyyy 01/02/2018
dd-M-yyyy hh:mm:ss 02-1-2018 06:07:59
dd MMMM yyyy 02 January 2018
dd MMMM yyyy zzzz 02 January 2018 India Standard Time
E, dd MMM yyyy HH:mm:ss z Tue, 02 Jan 2018 18:07:59 IST

שימוש ב־SimpleDateFormat()

כדי לפענח תאריכים אנו צריכים ליצור מופע של SimpleDateFormat באמצעות הבנאי ולאחר מכן להשתמש בשיטת format():

String pattern = "MM-dd-yyyy";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
String date = simpleDateFormat.format(new Date());
System.out.println(date);

קטע קוד זה יפיק "MM-dd-yyyy":

Output
01-02-2018

תבנית זו מייצרת "חודש בשנה", "יום בחודש" ו"שנה". סוג התו (והאותיות הגדולות) וכמות התווים משפיעים על המחרוזת. החודש ייצג בשני ספרות, היום בשני ספרות, והשנה בארבע ספרות.

קטע קוד זה הציג את התאריך "2 בינואר 2018" כ-"01-02-2018".

עבור פענוח שעות, עלינו לשנות את התבנית בעת יצירת מופע של SimpleDateFormat.

String pattern = "HH:mm:ss.SSSZ";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
String date = simpleDateFormat.format(new Date());
System.out.println(date);

קטע קוד זה יפיק "HH:mm:ss.SSSZ":

Output
13:03:15.454+0530

תבנית זו מייצרת "שעות", "דקות", "שניות", "מילישניות" ו"אופסט זמן בשעות (תבנית RFC)".

קטע קוד זה הציג את השעה כ-"13:03:15.454+0530".

שימוש ב־parse()

הפענוח הוא המרת מחרוזת למופע של `java.util.Date`. אנו יכולים לבצע פענוח של מחרוזת למופע תאריך באמצעות השיטה parse() של כיתת SimpleDateFormat. כדי לבצע פענוח של מחרוזת לתאריך, אנו זקוקים למופע של כיתת SimpleDateFormat ולתבנית מחרוזת כקלט לבנאי הכיתה.

String pattern = "MM-dd-yyyy";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
Date date = simpleDateFormat.parse("12-01-2018");
System.out.println(date);

זה יפיק תאריך (12-01-2018) בלעדי זמן מצויין:

Output
Sat Dec 01 00:00:00 IST 2018

עכשיו נביט בדוגמה של SimpleDateFormat לפענוח זמן.

String pattern = "HH:mm:ss";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
Date date = simpleDateFormat.parse("22:00:03");
System.out.println(date);

זה יפיק זמן (22:00:03) בלעדי תאריך מצויין:

Output
Thu Jan 01 22:00:03 IST 1970

כיוון שלא ציינו תאריך, התוכנית נחשבה לתקופת האפוק (כלומר, 01-Jan-1970).

שימוש ב־Locale

עבדנו עם Locale כחלק מ־DateFormat וראינו שלוקליות משמשות על פי אזורים.

String pattern = "EEEEE MMMMM yyyy HH:mm:ss.SSSZ";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern, new Locale("fr", "FR"));
Date date = simpleDateFormat.format(new Date());
System.out.println(date);

קטע זה יפרמט את הזמן הנוכחי בשפה הצרפתית (fr) ובאזור צרפת (FR):

Output
mardi janvier 2018 14:51:02.354+0530

היום והחודש מתייחסים לשפה הצרפתית על פי ה־Locale שסופק כקלט – mardi הוא "שלישי" ו־janvier הוא "ינואר".

סיכום

במאמר זה, למדת על SimpleDateFormat ו־DateFormat של Java.

הסבר:

Source:
https://www.digitalocean.com/community/tutorials/java-simpledateformat-java-date-format