השוואת תאריכים בג'אווה

1. הקדמה

במדריך זה נתמקד כיצד להשוות תאריכים באמצעות Java 8 Date / Time API. נצלול לשיטות שונות כדי לבדוק אם שני תאריכים שווים וכיצד להשוות תאריכים.

2. השוואת תאריכים

הדרך הבסיסית להביע תאריך בג'אווה היא LocalDate. בואו ניקח בחשבון שניים LocalDate מופעי אובייקט המייצגים את ה -10 באוגוסט 2019 ואת ה -1 ביולי 2019:

LocalDate firstDate = LocalDate.of (2019, 8, 10); LocalDate secondDate = LocalDate.of (2019, 7, 1);

אנחנו הולכים להשוות בין שניים LocalDate באמצעות אובייקטים isAfter (), isBefore (), ו שיטות isEqual (), בנוסף ל שווים() ו בהשוואה ל().

אנו משתמשים ב- isAfter () שיטה לבדוק אם מופע התאריך הוא אחרי התאריך שצוין אחר. לכן, קביעת JUnit הבאה תעבור:

assertThat (firstDate.isAfter (secondDate), הוא (נכון));

באופן אנלוגי, השיטה isBefore () בודק אם מופע התאריך הוא לפני התאריך שצוין אחר:

assertThat (firstDate.isBefore (secondDate), הוא (שקר));

השיטה שווה() בודק אם תאריך מייצג את אותה נקודה על ציר הזמן המקומי כמו התאריך שצוין אחר:

assertThat (firstDate.isEqual (firstDate), הוא (נכון)); assertThat (firstDate.isEqual (secondDate), הוא (שקר));

2.1. השוואת תאריכים באמצעות ניתן להשוות מִמְשָׁק

ה שווים() השיטה תתן את אותה התוצאה כמו שווה(), אך רק אם הטיעון שהועבר הוא מאותו סוג (במקרה זה, LocalDate):

assertThat (firstDate.equals (secondDate), הוא (שקר));

ה שווה() ניתן להשתמש במקום זאת כדי להשוות לאובייקטים מסוג אחר, כגון תאריך יפני, ThaiBuddhistDate, וכו.

אנו יכולים להשוות בין שני מופעי תאריך באמצעות בהשוואה ל() לפי הגדרת ה- ניתן להשוות מִמְשָׁק:

assertThat (firstDate.compareTo (secondDate), הוא (1)); assertThat (secondDate.compareTo (firstDate), הוא (-1));

3. השוואת מופעי תאריך המכילים את רכיב הזמן

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

דומה ל LocalDateאנחנו משווים שניים LocalDateTime מקרים בשיטות isAfter (), isBefore () ו שווה(). בנוסף, שווים() ו בהשוואה ל() יכול לשמש בצורה דומה כמתואר עבור LocalDate.

כמו כן, אנו יכולים להשתמש באותן שיטות להשוואה בין שתיים ZonedDateTime מקרים. בואו נשווה 8:00 שעון מקומי בניו יורק ו 14:00 שעון מקומי בברלין, באותו יום:

ZonedDateTime timeInNewYork = ZonedDateTime.of (2019, 8, 10, 8, 0, 0, 0, ZoneId.of ("אמריקה / ניו_יורק")); ZonedDateTime timeInBerlin = ZonedDateTime.of (2019, 8, 10, 14, 0, 0, 0, ZoneId.of ("אירופה / ברלין")); assertThat (timeInNewYork.isAfter (timeInBerlin), הוא (שקר)); assertThat (timeInNewYork.isBefore (timeInBerlin), הוא (שקר)); assertThat (timeInNewYork.isEqual (timeInBerlin), הוא (נכון));

למרות ששניהם ZonedDateTime מקרים מייצגים את אותו רגע בזמן, הם אינם מייצגים אובייקטים Java שווים. יש להם שונה LocalDateTime ו ZoneId שדות פנימיים:

assertThat (timeInNewYork.equals (timeInBerlin), הוא (שקר)); assertThat (timeInNewYork.compareTo (timeInBerlin), הוא (-1));

4. השוואות נוספות

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

ראשית, נבדוק אם מקרים של LocalDateTime ו LocalDate נמצאים באותו יום:

בוליאני סטטי ציבורי isSameDay (חותמת זמן LocalDateTime, LocalDate localDateToCompare) {return timestamp.toLocalDate (). isEqual (localDateToCompare); }

שנית, נבדוק אם שני מקרים של LocalDateTime נמצאים באותו יום:

בוליאני סטטי ציבורי isSameDay (חותמת זמן LocalDateTime, LocalDateTime timestampToCompare) {חזור timestamp.truncatedTo (DAYS) .isEqual (timestampToCompare.truncatedTo (DAYS)); }

ה truncatedTo (TemporalUnit) השיטה מקטעת תאריך ברמה הנתונה, שבדוגמה שלנו הוא יום.

שלישית, אנו יכולים ליישם השוואה ברמה של שעה:

ציבורי בוליאני סטטי ציבורי isSameHour (חותמת זמן LocalDateTime, LocalDateTime timestampToCompare) {return timestamp.truncatedTo (HOURS) .isEqual (timestampToCompare.truncatedTo (HOURS)); }

לבסוף, באופן דומה, אנו יכולים לבדוק אם שניים ZonedDateTime מקרים קורים באותה שעה:

בוליאני סטטי ציבורי isSameHour (ZonedDateTime zonedTimestamp, ZonedDateTime zonedTimestampToCompare) {return zonedTimestamp.truncatedTo (HOURS) .isEqual (zonedTimestampToCompare.truncatedTo (HOURS)); }

אנחנו יכולים לראות את השניים האלה ZonedDateTime עצמים מתרחשים למעשה באותה שעה, גם אם השעות המקומיות שלהם שונות (8:30 ו- 14:00 בהתאמה):

ZonedDateTime zonedTimestamp = ZonedDateTime.of (2019, 8, 10, 8, 30, 0, 0, ZoneId.of ("אמריקה / ניו_יורק")); ZonedDateTime zonedTimestampToCompare = ZonedDateTime.of (2019, 8, 10, 14, 0, 0, 0, ZoneId.of ("אירופה / ברלין")); assertThat (DateTimeComparisonUtils. isSameHour (zonedTimestamp, zonedTimestampToCompare), הוא (נכון));

5. השוואה ב- API הישן של Java Date

לפני Java 8 היינו צריכים להשתמש java.util.Date ו java.util.Calendar שיעורים לתמרון מידע על תאריך / שעה. לעיצוב ה- API הישן של Java Date יש פגמים רבים, כגון היותו מורכב ולא בטיחות הברגה. ה java.util.Date מופע מייצג "רגע בזמן" ולא תאריך אמיתי.

אחד הפתרונות היה להשתמש בספריית ג'ודה טיים. מאז שחרורו של Java 8, מומלץ לעבור ל- API 8 של Java 8 Date / Time.

דומה ל LocalDate ו LocalDateTime, שניהם java.util.Date ו java.util.Calendar יש לאובייקטים לאחר(), לפני(), בהשוואה ל() ו שווים() שיטות להשוואה בין שני מופעי תאריך. התאריכים מושווים כמו הרגעים בזמן, ברמה של אלפית השנייה:

תאריך firstDate = toDate (LocalDateTime.of (2019, 8, 10, 0, 00, 00)); תאריך secondDate = toDate (LocalDateTime.of (2019, 8, 15, 0, 00, 00)); assertThat (firstDate.after (secondDate), הוא (שקר)); assertThat (firstDate.before (secondDate), הוא (נכון)); assertThat (firstDate.compareTo (secondDate), הוא (-1)); assertThat (firstDate.equals (secondDate), הוא (שקר));

להשוואות מורכבות יותר נוכל להשתמש DateUtils מספריית Apache Commons Lang. שיעור זה מכיל שיטות שימושיות רבות להתמודדות תַאֲרִיך ו לוּחַ שָׁנָה חפצים:

בוליאני סטטי ציבורי isSameDay (תאריך תאריך, תאריך תאריך להשוואה) {החזר DateUtils.isSameDay (תאריך, תאריך תאריך השוואה); } בוליאני סטטי ציבורי isSameHour (תאריך תאריך, תאריך תאריך להשוואה) {החזר DateUtils.truncatedEquals (תאריך, תאריך לתא השוואה, Calendar.HOUR); }

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

6. מסקנה

במאמר זה בחנו דרכים שונות להשוואת מקרי תאריכים ב- Java.

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

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