קבל תאריך ללא זמן בג'אווה

1. הקדמה

במדריך הקצר הזה נראה כיצד להשיג תַאֲרִיך בלי זמן בג'אווה.

אנו נראה כיצד לעשות זאת לפני ואחרי Java 8 מכיוון שהדברים הפכו קצת שונים לאחר שחרורו של ה- API החדש של הזמן ב- Java 8.

2. לפני Java 8

לפני Java 8, לא הייתה דרך ישירה להשיג תַאֲרִיך בלי זמן אלא אם כן השתמשנו בספריות צד ג 'כמו Joda-time.

זה בגלל ש ה תַאֲרִיך class ב- Java הוא ייצוג של רגע ספציפי בזמן, המתבטא באלפיות השנייה. לכן זה לא מאפשר להתעלם מהזמן ב- תַאֲרִיך.

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

2.1. באמצעות לוּחַ שָׁנָה

אחת הדרכים הנפוצות ביותר להשיג תַאֲרִיך בלי זמן זה להשתמש ב לוּחַ שָׁנָה בכיתה כדי לקבוע את הזמן לאפס. על ידי כך אנו מקבלים תאריך נקי, כאשר הזמן נקבע בתחילת היום.

בואו נראה את זה בקוד:

תאריך סטטי ציבורי getDateWithoutTimeUsingCalendar () {לוח שנה לוח שנה = Calendar.getInstance (); calendar.set (Calendar.HOUR_OF_DAY, 0); calendar.set (Calendar.MINUTE, 0); calendar.set (Calendar.SECOND, 0); calendar.set (Calendar.MILLISECOND, 0); להחזיר calendar.getTime (); }

אם נקרא לשיטה זו נקבל תאריך כזה:

שבת 23 ביוני 00:00:00 CEST 2018

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

כמו כן, כדי לוודא שאין זמן מוגדר ב תַאֲרִיך חזרנו, נוכל ליצור את הבדיקה הבאה:

@ מבחן ציבורי בטל כאשר GettingDateWithoutTimeUsingCalendar_thenReturnDateWithoutTime () {Date dateWithoutTime = DateWithoutTime.getDateWithoutTimeUsingCalendar (); לוח שנה לוח שנה = Calendar.getInstance (); calendar.setTime (dateWithoutTime); int day = calendar.get (Calendar.DAY_OF_MONTH); calendar.setTimeInMillis (dateWithoutTime.getTime () + MILLISECONDS_PER_DAY - 1); assertEquals (day, calendar.get (Calendar.DAY_OF_MONTH)); calendar.setTimeInMillis (dateWithoutTime.getTime () + MILLISECONDS_PER_DAY); assertNotEquals (day, calendar.get (Calendar.DAY_OF_MONTH)); }

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

2.2. באמצעות מעצב

דרך נוספת לעשות זאת היא על ידי עיצוב א תַאֲרִיך לתוך חוּט בלי הזמן ואז להמיר את זה חוּט בחזרה אל תַאֲרִיך. מאז חוּט עוצב ללא הזמן בו תַאֲרִיך המרה יוגדר לאפס.

בואו ליישם את זה כדי לראות איך זה עובד:

תאריך סטטי ציבורי getDateWithoutTimeUsingFormat () זורק ParseException {SimpleDateFormat מעצב = חדש SimpleDateFormat ("dd / MM / yyyy"); return formatter.parse (formatter.format (תאריך חדש ())); }

יישום זה מחזיר את אותו הדבר כמו השיטה המוצגת בסעיף הקודם:

שבת 23 ביוני 00:00:00 CEST 2018

שוב, אנו יכולים להשתמש במבחן כמו שעשינו בעבר כדי לוודא שאין זמן ב- תַאֲרִיך חזר.

3. שימוש ב- Java 8

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

לצורך מאמר זה נתמקד בשיעור LocalDate, שמייצג בדיוק את מה שאנחנו צריכים, תאריך ללא הזמן.

בואו נראה את זה עם הדוגמה הזו:

סטטי ציבורי LocalDate getLocalDate () {return LocalDate.now (); }

שיטה זו מחזירה א LocalDate התנגד לייצוג תאריך זה:

2018-06-23

כפי שאנו רואים, הוא מחזיר רק תאריך, הזמן מתעלם לחלוטין.

שוב, בואו לבדוק את זה כמו בעבר כדי לוודא ששיטה זו עובדת כצפוי:

@Test ציבורי בטל כאשר GettingLocalDate_thenReturnDateWithoutTime () {LocalDate localDate = DateWithoutTime.getLocalDate (); long millisLocalDate = localDate .atStartOfDay () .toInstant (OffsetDateTime .now () .getOffset ()) .toEpochMilli (); לוח שנה לוח שנה = Calendar.getInstance (); calendar.setTimeInMillis (millisLocalDate + MILLISECONDS_PER_DAY - 1); assertEquals (localDate.getDayOfMonth (), calendar.get (Calendar.DAY_OF_MONTH)); calendar.setTimeInMillis (millisLocalDate + MILLISECONDS_PER_DAY); assertNotEquals (localDate.getDayOfMonth (), calendar.get (Calendar.DAY_OF_MONTH)); }

4. מסקנה

במאמר זה הראינו כיצד להשיג תַאֲרִיך בלי זמן בג'אווה. לראשונה הראינו כיצד לעשות זאת לפני Java 8 וגם באמצעות Java 8.

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

כמו תמיד, קוד המקור המלא של הדוגמאות זמין באתר GitHub.