תאריך ושעה API הוא אחד מהתכונות הגדולות ביותר של הגרסה 8 של ג'אווה. בג'אווה חסר התקשורת העקבית לגבי תאריך ושעה מההתחלה, ו-
למה אנו זקוקים ל- API חדש של תאריך ושעה בג'אווה?
לפני שנתחיל להתעסק עם תאריך ושעה API של ג'אווה 8, בואו נראה למה אנו זקוקים ל- API חדש עבור זה. ישנם מספר בעיות עם המחלקות הקיימות הקשורות לתאריך ולשעה בג'אווה, חלק מהן הם:
- מחלקות תאריך ושעה של ג'אווה אינן מוגדרות באופן עקבי, יש לנו את מחלקת ה- Date בפקודת java.util וגם בפקודת java.sql. שוב, מחלקות העיצוב והניתוב מוגדרות בחבילת המחלקות java.text.
- ב- java.util.Date מכילה גם ערכי תאריך ושעה, בניגוד ל- java.sql.Date שמכילה רק ערך של תאריך. לא נכון שמופעל זה נמצא בחבילת java.sql. בנוסף, שתי המחלקות מכילות את אותו השם, מה שהוא עיצוב רע במיוחד.
- אין מחלקות מוגדרות באופן ברור עבור זמן, חותמת זמן, עיצוב וניתוב. יש לנו את מחלקת המופע java.text.DateFormat עבור צורך הניתוב והעיצוב. כלל המחלקה SimpleDateFormat נהוג לשימוש עבור ניתוב ועיצוב.
- כל המחלקות תאריך הן שינוי כך שהן אינן יכולות לזהות את האש בחוט, וזו אחת הבעיות הגדולות ביותר עם מחלקות תאריך ולוח שנה של ג'אווה.
- המחלקה Date אינה מספקת בינלאומיות, ואין בה תמיכה באזורי זמן. לכן הועלו המחלקות java.util.Calendar ו java.util.TimeZone, אך גם להן יש את כל הבעיות המצוינות לעיל. ישנם בעיות נוספות עם השיטות המוגדרות במחלקות Date ו Calendar, אך הבעיות הנ"ל מצביעות במובן ברור על כך שהייתה צורך ב-API עמיד לפרקטיקה תקינה של זמן ותאריך ב-Java. לכן, Joda Time שיחקה תפקיד מפתח כגורם שמחליפו באיכות.
ישנם חוקים נוספים בשיטות המוגדרות במחלקות Date ו-Calendar, אך הבעיות הנ"ל מצביעות במובן ברור על כך שהייתה צורך ב-API עמיד לפרקטיקה תקינה של זמן ותאריך ב-Java. לכן, Joda Time שיחקה תפקיד מפתח כגורם שמחליפו באיכות.עקרונות עיצוב זמן ותאריך ב-Java 8
עקרונות עיצוב זמן ותאריך ב-Java 8
API של זמן ותאריך ב-Java 8 הוא מימוש של JSR-310. הוא מיועד לשפר על כל החסרונות במימושים המקוריים של זמן ותאריך. חלק מהעקרונות המעצבים של ה-API החדש לזמן ותאריך הם:
-
בלתי נעילות: כל המחלקות ב-API החדש לזמן ותאריך הן בלתי נעילות ומתאימות לסביבות מרובות ליבה.
-
הפרדת דאטה: ה-API החדש מפריד באופן ברור בין זמן ותאריך נגיש לאדם ובין זמן ותאריך נגיש למכונה (חותמת Unix). הוא מגדיר מחלקות נפרדות לתאריך, לשעה, לתאריך ושעה, לחותמת זמן, לאזור זמן, וכו'.
-
בהירות: השיטות מוגדרות באופן ברור ומבצעות את אותו הפעולה בכל המחלקות. לדוגמה, כדי לקבל את המופע הנוכחי יש לנו את השיטה now(). ישנם שיטות format() ו parse() המוגדרות בכל המחלקות אלה במקום להיות להם מחלקה נפרדת לכך.
כל המחלקות משתמשות בתבנית יצרן (Factory Pattern) ובתבנית אסטרטגיה (Strategy Pattern) לטיפול טוב יותר. לאחר שהשתמשת בשיטות באחת מהמחלקות, העבודה עם מחלקות אחרות לא תהיה קשה.
-
פעולות שימושיות: כל המחלקות החדשות של API של תאריך-זמן מגיעות עם שיטות לביצוע משימות נפוצות, כגון הוספה, חיסור, עיצוב, פירוק, קבלת החלק הנפרד בתאריך/זמן, וכו'.
-
ניתן להרחבה: ה-Date Time API החדש עובד על מערכת הלוח הגרגוריאנית ISO-8601 אך ניתן להשתמש בו גם עם לוחות שנה לא-ISO אחרים.
חבילות API של תאריך וזמן
API של תאריך וזמן של Java 8 מורכב מהחבילות הבאות.
- java.time: זו החבילה הבסיסית של API התאריך והזמן החדש של Java. כל המחלקות הבסיסיות המרכזיות הן חלק מהחבילה הזו, כגון LocalDate, LocalTime, LocalDateTime, Instant, Period, Duration, וכו'. כל מחלקות אלו הן ללא שינוי ובטוחות בנוגע לתהליכי תכנות רציפים. לרוב, מחלקות אלו יהיו מספיקות לטיפול בדרישות נפוצות.
- java.time.chrono: חבילה זו מגדירה ממשקי API כלליים למערכות לוח שנה לא-ISO. ניתן להרחיב את המחלקה AbstractChronology כדי ליצור מערכת לוח שנה משלנו.
- java.time.format: חבילה זו מכילה מחלקות שמשמשות לעיצוב ולניתוב אובייקטים של תאריך-זמן. ברוב הזמן לא נשתמש בהן ישירות מכיוון שהמחלקות העיקריות בחבילת java.time מספקות שיטות עיצוב וניתוב.
- java.time.temporal: חבילה זו מכילה אובייקטים זמניים וניתן להשתמש בהם כדי לגלות את התאריכים או הזמנים הספציפיים הקשורים לאובייקטים של תאריך/זמן. לדוגמה, ניתן להשתמש בהם כדי לגלות את היום הראשון או האחרון של החודש. ניתן לזהות את השיטות הללו בקלות משום שהן תמיד מופיעות בפורמט "עםXXX".
- חבילת האזור של java.time: חבילה זו מכילה מחלקות לתמיכה באזורי זמן שונים ובחוקיהם.
דוגמאות למחלקות API של תאריך וזמן של Java 8
בדקנו את רוב חלקי API של תאריך וזמן של Java. הגיע הזמן לבדוק עכשיו את המחלקות החשובות ביותר של API של תאריך וזמן עם דוגמאות.
1. LocalDate
LocalDate היא מחלקה לא משתנה שמייצגת תאריך עם הפורמט הברירתי של yyyy-MM-dd. ניתן להשתמש בשיטת now() כדי לקבל את התאריך הנוכחי. ניתן גם לספק ארגומנטים קלט עבור שנה, חודש ותאריך כדי ליצור אינסטנס LocalDate.
המחלקה הזו מספקת שיטה מעומסת עבור now() בה ניתן להעביר ZoneId כדי לקבל תאריכים באזור זמן ספציפי. המחלקה הזו מספקת את אותה הפונקציונליות כמו java.sql.Date.
הסברים על שיטות LocalDate ניתנים בהערות. בעת הרצת התוכנית הזו, נקבל את הפלט הבא.
2. LocalTime
he
LocalTime הוא מחלקה לא ניתנת לשינוי שמייצגת זמן בפורמט המובן לבני אדם. הפורמט המוגדר כברירת מחדל הוא שעה:דקה:שנייה. בדומה ל־LocalDate, מחלקה זו מספקת תמיכה באזור זמן ויצירת מופע על ידי מסירת שעה, דקה ושנייה כארגומנטי קלט.
"`
פלט:
3. LocalDateTime
LocalDateTime הוא אובייקט תאריך-זמן לא ניתן לשינוי שמייצג תאריך-זמן עם פורמט ברירת מחדל כ yyyy-MM-dd-HH-mm-ss.zzz. זה מספק שיטת מפענח שמקבלת ארגומנטים של LocalDate ו־LocalTime כדי ליצור מופע LocalDateTime.
בכל שלושת הדוגמאות, ראינו שאם אנו מספקים ארגומנטים לא חוקיים ליצירת תאריך/זמן, אז הוא מזריק java.time.DateTimeException, שהוא RuntimeException, ולכן אין צורך לתפוס אותו באופן פורמלי.
ראינו גם כי אפשר לקבל נתוני תאריך/שעה על ידי העברת ZoneId, ניתן לקבל את רשימת ערכי ZoneId התומכים מתוך JavaDoc שלו. כאשר אנו מריצים את המחלקה לעיל, אנו מקבלים את הפלט הבא.
4. Instant
המחלקה Instant משמשת לעבוד עם פורמט זמן נקרא על ידי מכונה. היא אוחסנת תאריך ושעה בפורמט זמן של Unix.
פלט:
Java 8 Date API כלים
רוב מחלקות העקרונות לזמן תאריך מספקות שיטות כלים שונות כמו ימים פלוס/מינוס, שבועות, חודשים וכו'. ישנן שיטות עזר אחרות להתאמת התאריך באמצעות TemporalAdjuster
ולחישוב התקופה בין שני תאריכים.
פלט:
ניתוח ועיבוד תאריכים ב-Java 8
זה די נפוץ להעצים תאריכים לפורמטים שונים ולאחר מכן לנתח מחרוזת כדי לקבל אובייקטי תאריך ושעה.
פלט:
תמיכה לקוד ישן בממשק תאריך-זמן ב-API של Java
כיתות התאריך/הזמן הישנות משמשות ברוב היישומים, לכן יש להפעיל תאימות לאחור. לכן ישנם מספר שיטות שימושיות שבאמצעותן ניתן להמיר בין הכיתות הישנות לכיתות החדשות ולהיפך.
פלט:
כפי שניתן לראות, מתודות toString() של כיתות ה־TimeZone
ו־GregorianCalendar
הישנות הן פרטניות מדי ולא ידידותיות למשתמש.
מסקנה
I like this new Date Time API a lot. Some of the most used classes will be LocalDate and LocalDateTime. It’s very easy to work with the new classes. And, having similar methods that does a particular job makes it easy to find. It will take some time from moving legacy classes to new Date Time classes, but I believe it will be worth the time and effort.
Source:
https://www.digitalocean.com/community/tutorials/java-8-date-localdate-localdatetime-instant