TemporalAdjuster בג'אווה

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

במדריך זה, נסתכל במהירות על ה- TemporalAdjuster והשתמש בו בכמה תרחישים מעשיים.

Java 8 הציגה ספרייה חדשה לעבודה עם תאריכים ושעות - java.time ו TemporalAdjuster הוא חלק מזה. אם אתה רוצה לקרוא עוד על java.time, עיין במאמר ההיכרות הזה.

פשוט שים, TemporalAdjuster היא אסטרטגיה להתאמת א זְמַנִי לְהִתְנַגֵד. לפני שנכנס לשימוש ב- TemporalAdjusterבואו נסתכל על זְמַנִי הממשק עצמו.

2. זְמַנִי

א זְמַנִי מגדיר ייצוג של תאריך, שעה או שילוב של שניהם, בהתאם ליישום בו אנו נשתמש.

ישנם מספר יישומים של ה- זְמַנִי ממשק, כולל:

  • LocalDate - המייצג תאריך ללא אזור זמן
  • LocalDateTime - המייצג תאריך ושעה ללא אזור זמן
  • HijrahDate - המייצג תאריך במערכת לוח השנה של חיג'רה
  • MinguoDate - המייצג תאריך במערכת לוח השנה של Minguo
  • ThaiBuddhistDate - המייצג תאריך במערכת הלוח הבודהיסטית התאילנדית

3. TemporalAdjuster

אחד הממשקים הכלולים בספריה חדשה זו הוא TemporalAdjuster.

TemporalAdjuster הוא ממשק פונקציונלי שיש לו יישומים רבים שהוגדרו מראש ב- TemporalAdjustters מעמד. לממשק יש שיטה מופשטת אחת בשם להתאמת () שניתן לקרוא בכל מימושו על ידי העברת a זְמַנִי להתנגד לכך.

TemporalAdjuster מאפשר לנו לבצע מניפולציות מורכבות בתאריכים. לדוגמהאנו יכולים להשיג את התאריך של יום ראשון הבא, היום האחרון של החודש הנוכחי או את היום הראשון של השנה הבאה. אנחנו יכולים, כמובן, לעשות זאת באמצעות הישן java.util.Calendar.

עם זאת, ה- API החדש ממצה את ההיגיון הבסיסי באמצעות היישומים שהוגדרו מראש. למידע נוסף בקרו ב- Javadoc.

4. מוגדר מראש TemporalAdjustters

הכיתה TemporalAdjustters יש הרבה שיטות סטטיות מוגדרות מראש שמחזירות א TemporalAdjuster אובייקט להתאמה זְמַנִי חפצים בדרכים רבות ושונות ולא משנה איזה יישום של זְמַנִי הם אולי.

להלן רשימה קצרה של שיטות אלה והגדרה מהירה שלהן:

  • dayOfWeekInMonth () - מתאם ליום השבוע הרגיל. למשל התאריך של יום שלישי השני במרץ
  • firstDayOfMonth () - מתאם לתאריך היום הראשון לחודש הנוכחי
  • firstDayOfNextMonth () - מתאם לתאריך היום הראשון של החודש הבא
  • firstDayOfNextYear () - מתאם לתאריך היום הראשון של השנה הבאה
  • firstDayOfYear () - מתאם לתאריך היום הראשון של השנה הנוכחית
  • lastDayOfMonth () - מתאם לתאריך היום האחרון של החודש הנוכחי
  • nextOrSame () - מכוונן לתאריך ההתרחשות הבאה של יום בשבוע ספציפי או באותו יום למקרה שהיום תואם את יום השבוע הנדרש

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

נתחיל בדוגמה פשוטה - במקום להשתמש בתאריך ספציפי כמו בדוגמאות, נוכל להשתמש LocalDate.now () כדי לקבל את התאריך הנוכחי משעון המערכת.

אך לצורך הדרכה זו אנו נשתמש בתאריך קבוע כך שהבדיקות לא ייכשלו מאוחר יותר כאשר התוצאה הצפויה תשתנה. בואו נראה איך נוכל להשתמש ב- TemporalAdjustters שיעור בכדי להשיג את תאריך יום ראשון לאחר השעה 07/07/2017:

@Test הציבור בטל כאשרAdjust_thenNextSunday () {LocalDate localDate = LocalDate.of (2017, 07, 8); LocalDate nextSunday = localDate.with (TemporalAdjusters.next (DayOfWeek.SUNDAY)); מחרוזת צפויה = "09-07-2017"; assertEquals (צפוי, nextSunday.toString ()); }

כך נוכל להשיג את היום האחרון של החודש הנוכחי:

LocalDate lastDayOfMonth = localDate.with (TemporalAdjusters.lastDayOfMonth ());

5. הגדרת מותאם אישית TemporalAdjuster יישומים

אנו יכולים גם להגדיר את היישומים המותאמים אישית שלנו עבור TemporalAdjuster. ישנן שתי דרכים שונות לעשות זאת.

5.1. שימוש בביטויי למבדה

בואו נראה כיצד נוכל להשיג את התאריך 14 יום אחרי 08-07-2017 באמצעות ה- Temporal.with () שיטה:

@Test הציבור בטל כאשר Adjust_thenFourteenDaysAfterDate () {LocalDate localDate = LocalDate.of (2017, 07, 8); TemporalAdjuster temporalAdjuster = t -> t.plus (Period.ofDays (14)); תוצאת LocalDate = localDate.with (temporalAdjuster); מחרוזת fourteenDaysAfterDate = "22/07/2017"; assertEquals (fourteenDaysAfterDate, result.toString ()); }

בדוגמה זו, באמצעות ביטוי למבדה, הגדרנו את TemporalAdjuster התנגדות להוסיף 14 יום ל localDate אובייקט, המחזיק בתאריך (07/07/2017).

בואו נראה איך נוכל להשיג את התאריך של יום העבודה מיד אחרי 08-07-2017 על ידי הגדרת שלנו TemporalAdjuster יישומים באמצעות ביטוי למבדה. אבל, הפעם, באמצעות ofDateAdjuster () שיטת מפעל סטטית:

TemporalAdjuster סטטי NEXT_WORKING_DAY = TemporalAdjusters.ofDateAdjuster (תאריך -> {DayOfWeek dayOfWeek = date.getDayOfWeek (); int daysToAdd; אם (dayOfWeek == DayOfWeek.FRIDAY) daysToAdd = 3 יום אחר = יום; ; אחר daysToAdd = 1; חזור today.plusDays (daysToAdd);});

בודק את הקוד שלנו:

@Test הציבור בטל כאשרAdjust_thenNextWorkingDay () {LocalDate localDate = LocalDate.of (2017, 07, 8); TemporalAdjuster temporalAdjuster = NEXT_WORKING_DAY; תוצאת LocalDate = localDate.with (temporalAdjuster); assertEquals ("2017-07-10", date.toString ()); }

5.2. על ידי יישום ה- TemporalAdjuster מִמְשָׁק

בואו נראה איך נוכל לכתוב מנהג TemporalAdjuster שמשיג את יום העבודה לאחר 08-07-2017 על ידי יישום ה- TemporalAdjuster מִמְשָׁק:

מחלקה ציבורית CustomTemporalAdjuster מיישם TemporalAdjuster {@Override public Temporal adjustInto (Temporal temporal) {DayOfWeek dayOfWeek = DayOfWeek.of (temporal.get (ChronoField.DAY_OF_WEEK)); int daysToAdd; אם (dayOfWeek == DayOfWeek.FRIDAY) daysToAdd = 3; אחרת אם (dayOfWeek == DayOfWeek.SATURDAY) daysToAdd = 2; אחר daysToAdd = 1; החזר temporal.plus (daysToAdd, ChronoUnit.DAYS); }}

עכשיו, בואו נבצע את הבדיקה שלנו:

@Test הציבור בטל כאשר AdjustAndImplementInterface_thenNextWorkingDay () {LocalDate localDate = LocalDate.of (2017, 07, 8); CustomTemporalAdjuster temporalAdjuster = חדש CustomTemporalAdjuster (); LocalDate nextWorkingDay = localDate.with (temporalAdjuster); assertEquals ("2017-07-10", nextWorkingDay.toString ()); }

6. מסקנה

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

ניתן למצוא את היישום המלא של מדריך זה ב- GitHub.


$config[zx-auto] not found$config[zx-overlay] not found