מדריך DateTimeFormatter

1. סקירה כללית

במדריך זה נסקור את Java 8 DateTimeFormatter הכיתה ודפוסי העיצוב שלה. אנו נדון גם במקרי שימוש אפשריים בשיעור זה.

אנחנו יכולים להשתמש DateTimeFormatter לעיצוב אחיד של תאריכים ושעות באפליקציה עם דפוסים מוגדרים מראש או מוגדרים על ידי המשתמש.

2. DateTimeFormatter עם מקרים מוגדרים מראש

DateTimeFormatter מגיע עם מספר פורמטים מוגדרים מראש של תאריך / שעה העומדים בתקני ISO ו- RFC. לדוגמה, אנו יכולים להשתמש ב- ISO_LOCAL_DATE למשל לנתח תאריך כמו '2018-03-09':

DateTimeFormatter.ISO_LOCAL_DATE.format (LocalDate.of (2018, 3, 9));

כדי לנתח תאריך עם קיזוז, נוכל להשתמש ISO_OFFSET_DATE להשיג פלט כמו '2018-03-09-03: 00':

DateTimeFormatter.ISO_OFFSET_DATE.format (LocalDate.of (2018, 3, 9) .atStartOfDay (ZoneId.of ("UTC-3")));

רוב המקרים שהוגדרו מראש של DateTimeFormatter בכיתה מתמקדים בתקן ISO-8601. ISO-8601 הוא תקן בינלאומי לעיצוב תאריך ושעה.

עם זאת, יש מופע אחד מוגדר מראש המנתח את RFC-1123, דרישה למארחי אינטרנט, שפורסם על ידי IETF:

DateTimeFormatter.RFC_1123_DATE_TIME.format (LocalDate.of (2018, 3, 9) .atStartOfDay (ZoneId.of ("UTC-3")));

קטע זה מייצר 'שישי, 9 במרץ 2018 00:00:00 -0300‘.

לפעמים עלינו לתפעל את התאריך שאנו מקבלים כ- חוּט בפורמט ידוע. אנחנו יכולים לעשות שימוש ב- לְנַתֵחַ() שיטה:

LocalDate.from (DateTimeFormatter.ISO_LOCAL_DATE.parse ("2018-03-09")). PlusDays (3);

התוצאה של קטע קוד זה היא LocalDate נציגות ל -12 במרץ 2018.

3. DateTimeFormatter עם FormatStyle

לפעמים אולי נרצה להדפיס תאריכים בצורה שקריאה אנושית.

במקרים כאלה, אנו עשויים להשתמש java.time.format.FormatStyle ערכי enum (FULL, LONG, MEDIUM, SHORT) עם שלנו DateTimeFormatter:

LocalDate anotherSummerDay = LocalDate.of (2016, 8, 23); System.out.println (DateTimeFormatter.ofLocalizedDate (FormatStyle.FULL) .format (anotherSummerDay)); System.out.println (DateTimeFormatter.ofLocalizedDate (FormatStyle.LONG) .format (עוד יום קיץ)); System.out.println (DateTimeFormatter.ofLocalizedDate (FormatStyle.MEDIUM) .format (anotherSummerDay)); System.out.println (DateTimeFormatter.ofLocalizedDate (FormatStyle.SHORT) .format (עוד יום קיץ));

הפלט של סגנונות העיצוב השונים של אותו תאריך הוא:

יום שלישי 23 באוגוסט 2016 23 באוגוסט 2016 23 באוגוסט 2016 23/8/16

אנו עשויים להשתמש גם בסגנונות עיצוב מוגדרים מראש עבור תאריך ושעה. להשתמש FormatStyle עם הזמן נצטרך להשתמש ZonedDateTime למשל, אחרת DateTimeException ייזרק:

LocalDate anotherSummerDay = LocalDate.of (2016, 8, 23); LocalTime anotherTime = LocalTime.of (13, 12, 45); ZonedDateTime zonedDateTime = ZonedDateTime.of (anotherSummerDay, anotherTime, ZoneId.of ("אירופה / הלסינקי")); System.out.println (DateTimeFormatter.ofLocalizedDateTime (FormatStyle.FULL) .format (zonedDateTime)); System.out.println (DateTimeFormatter.ofLocalizedDateTime (FormatStyle.LONG) .format (zonedDateTime)); System.out.println (DateTimeFormatter.ofLocalizedDateTime (FormatStyle.MEDIUM) .format (zonedDateTime)); System.out.println (DateTimeFormatter.ofLocalizedDateTime (FormatStyle.SHORT) .format (zonedDateTime));

שימו לב שהשתמשנו ofLocalizedDateTime () שיטה של DateTimeFormatter הפעם.

והתפוקה שאנו מקבלים היא:

יום שלישי 23 באוגוסט 2016 13:12:45 EEST 23 באוגוסט 2016 13:12:45 EEST 23 באוגוסט 2016 13:12:45 23/08/16 13:12

אנחנו יכולים גם להשתמש FormatStyle לנתח זמן תאריך חוּט להמיר אותו ל ZonedDateTime, לדוגמה.

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

ZonedDateTime dateTime = ZonedDateTime.from (DateTimeFormatter.ofLocalizedDateTime (FormatStyle.FULL) .parse ("יום שלישי, 23 באוגוסט 2016 13:12:45 EET")); System.out.println (dateTime.plusHours (9));

הפלט של קטע זה הוא "2016-08-23T22: 12: 45 + 03: 00 [Europe / Bucharest]", שימו לב שהשעה השתנתה ל- "22:12:45".

4. DateTimeFormatter עם פורמטים מותאמים אישית

פורמטים וסגנונות מוגדרים מראש ומובנים יכולים לכסות הרבה מצבים. עם זאת, לפעמים אנו צריכים לעצב תאריך ושעה בצורה שונה במקצת. זה כאשר דפוסי עיצוב מותאמים אישית נכנסים לתמונה.

4.1. DateTimeFormatter לדייט

נניח שאנחנו רוצים להציג א java.time.LocalDate אובייקט באמצעות פורמט אירופי רגיל כמו 31.12.2018. לשם כך נוכל לקרוא לשיטת המפעל DateTimeFormatter.ofPattern ("dd.MM.yyyy").

זה ייצור מתאים DateTimeFormatter למשל שנוכל להשתמש בו לעיצוב התאריך שלנו:

מחרוזת europeanDatePattern = "dd.MM.yyyy"; DateTimeFormatter europeanDateFormatter = DateTimeFormatter.ofPattern (europeanDatePattern); System.out.println (europeanDateFormatter.format (LocalDate.of (2016, 7, 31)));

הפלט של קטע קוד זה יהיה "31.07.2016".

יש הרבה אותיות תבניות שונות בהן נוכל ליצור פורמט לתאריכים שיתאים לצרכים שלנו:

 משמעות הסמל דוגמאות להצגה ------ ------- ------------ ------- u שנת 2004; 04 y שנת עידן 2004; 04 חודש / שנה מספר שנה / טקסט 7; 07; יול; יולי; יום החודש מספר 10

זהו תמצית של תיעוד Java הרשמי ל- DateTimeFormatter מעמד.

מספר האותיות בתבנית התבנית הוא משמעותי.

אם נשתמש בתבנית של שתי אותיות לחודש, נקבל ייצוג של חודש דו ספרתי. אם מספר החודש קטן מ -10, הוא מרופד באפס. כאשר איננו זקוקים לריפוד המוזכר עם אפסים, אנו יכולים להשתמש בתבנית אחת "M", שתציג את ינואר כ- "1".

אם במקרה אנו משתמשים בתבנית של ארבע אותיות לחודש, "MMMM", נקבל ייצוג "טופס מלא". בדוגמה שלנו, זה "יולי". דפוס בן 5 אותיות, "MMMMM", יגרום למעצב להשתמש ב"צורה צרה ". במקרה שלנו, נעשה שימוש ב- "J".

כמו כן, ניתן להשתמש בדפוס עיצוב מותאם אישית גם לניתוח מחרוזת המכילה תאריך:

DateTimeFormatter europeanDateFormatter = DateTimeFormatter.ofPattern ("dd.MM.yyyy"); System.out.println (LocalDate.from (europeanDateFormatter.parse ("15.08.2014")). IsLeapYear ());

קטע קוד זה בודק אם התאריך “15.08.2014"זו שנה מעוברת, והיא לא.

4.2. DateTimeFormatter לזמן

יש גם אותיות תבניות שניתן להשתמש בהן לדפוסי זמן:

 סמל משמעות דוגמאות להצגה ------ ------- ------------ ------- H שעת היום (0-23) מספר 0 מ ' מספר דקה שעה מספר 30 שניות דקה שנייה 55 S שבריר שנייה 978 ננו מספר שנייה 987654321

זה די פשוט לשימוש DateTimeFormatter לעצב א java.time.LocalTime למשל. נניח שאנחנו רוצים להציג זמן (שעות, דקות ושניות) המופרד במעי הגס:

מחרוזת timeColonPattern = "HH: mm: ss"; DateTimeFormatter timeColonFormatter = DateTimeFormatter.ofPattern (timeColonPattern); LocalTime colonTime = LocalTime.of (17, 35, 50); System.out.println (timeColonFormatter.format (colonTime));

זה ייצור תפוקה "17:35:50“.

אם ברצוננו להוסיף אלפיות שניות לפלט עלינו להוסיף "SSS" לתבנית:

מחרוזת timeColonPattern = "HH: mm: ss SSS"; DateTimeFormatter timeColonFormatter = DateTimeFormatter.ofPattern (timeColonPattern); LocalTime colonTime = LocalTime.of (17, 35, 50) .plus (329, ChronoUnit.MILLIS); System.out.println (timeColonFormatter.format (colonTime));

מה שנותן את התפוקה "17:35:50 329“.

שים לב ש- "HH" הוא תבנית של שעה ביום שמייצרת את התפוקה של 0-23. כשאנחנו רוצים להציג AM / PM, עלינו להשתמש באותיות קטנות "hh" במשך שעות ולהוסיף תבנית "a":

מחרוזת timeColonPattern = "hh: mm: ss a"; DateTimeFormatter timeColonFormatter = DateTimeFormatter.ofPattern (timeColonPattern); LocalTime colonTime = LocalTime.of (17, 35, 50); System.out.println (timeColonFormatter.format (colonTime));

התפוקה שנוצרה היא "17:35:50“.

אולי נרצה לנתח זמן חוּט עם המעצב המותאם אישית שלנו ובדוק אם זה לפני הצהריים:

DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern ("hh: mm: ss a"); System.out.println (LocalTime.from (timeFormatter.parse ("12:25:30 AM")). IsBefore (LocalTime.NOON));

הפלט של קטע הקודם האחרון מראה שהזמן הנתון הוא למעשה לפני הצהריים.

4.3. DateTimeFormatter עבור אזורי זמן

לעתים קרובות אנו רוצים לראות אזור זמן של משתנה תאריך-זמן מסוים. אם במקרה אנו משתמשים בשעה תאריך מבוססת ניו יורק (UTC -4), אנו עשויים להשתמש באות דפוס "z" לשם אזור הזמן:

מחרוזת newYorkDateTimePattern = "dd.MM.yyyy HH: mm z"; DateTimeFormatter newYorkDateFormatter = DateTimeFormatter.ofPattern (newYorkDateTimePattern); LocalDateTime summerDay = LocalDateTime.of (2016, 7, 31, 14, 15); System.out.println (newYorkDateFormatter.format (ZonedDateTime.of (summerDay, ZoneId.of ("UTC-4"))));

זה ייצור את הפלט "31.07.2016 14:15 UTC-04: 00".

אנו יכולים לנתח מחרוזות תאריך עם אזורי זמן בדיוק כפי שעשינו קודם:

DateTimeFormatter zonedFormatter = DateTimeFormatter.ofPattern ("dd.MM.yyyy HH: mm z"); System.out.println (ZonedDateTime.from (zonedFormatter.parse ("31.07.2016 14:15 GMT + 02: 00")). GetOffset (). GetTotalSeconds ());

הפלט של קוד זה הוא "7200" שניות, או שעתיים, כפי שהיינו מצפים.

עלינו לוודא כי אנו מספקים זמן תאריך נכון חוּט אל ה לְנַתֵחַ() שיטה. אם נעביר את "31.07.2016 14:15", ללא אזור זמן ל מתוכנן מקטע הקוד האחרון נקבל DateTimeParseException.

5. מסקנה

במדריך זה דנו כיצד להשתמש ב- DateTimeFormatter כיתה לתבנית תאריכים ושעות. השתמשנו בתבניות דוגמאות אמיתיות המופיעות לעיתים קרובות כאשר אנו עובדים עם מקרים של תאריך.

אנו יכולים לברר פרטים נוספים על Java 8 תאריך שעה ממשק API במדריכות קודמות. כמו תמיד, קוד המקור המשמש במדריך זמין ב- GitHub.