קבלת מספר השבוע מכל תאריך

1. הקדמה

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

2. לפני Java 8

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

2.1. קבל מספר שבוע באמצעות לוּחַ שָׁנָה שדות

בואו נסתכל על הדוגמה הראשונה שלנו:

לוח שנה לוח שנה = Calendar.getInstance (אזור); calendar.set (שנה, חודש, יום); int weekOfYear = calendar.get (Calendar.WEEK_OF_YEAR);

אנחנו פשוט יוצרים a לוּחַ שָׁנָה למשל עבור הנתון אזור וקבע את השנה, החודש והיום, ולבסוף, אנו מקבלים את WEEK_OF_YEAR שדה מה לוּחַ שָׁנָה לְהִתְנַגֵד. פעולה זו תחזיר את מספר השבוע בשנה הנוכחית.

עכשיו, בואו נסתכל כיצד להפעיל שיטה זו מאחת ממבחני היחידות שלנו:

@ מבחן הריק ציבורי givenDateUsingFieldsAndLocaleItaly_whenGetWeekNumber_thenWeekIsReturnedCorrectly () {לוח שנה לוח שנה = Calendar.getInstance (Locale.ITALY); calendar.set (2020, 10, 22); assertEquals (47, calendar.get (Calendar.WEEK_OF_YEAR)); }

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

2.2. קבל מספר שבוע באמצעות אזור הגדרות

בדוגמה הלפני אחרונה, נבחן מה ההשפעה של החלת הגדרות נוספות על שלנו לוּחַ שָׁנָה יכול לקבל:

לוח שנה לוח שנה = Calendar.getInstance (); calendar.setFirstDayOfWeek (firstDayOfWeek); calendar.setMinimalDaysInFirstWeek (minimalDaysInFirstWeek); calendar.set (שנה, חודש, יום); int weekOfYear = calendar.get (Calendar.WEEK_OF_YEAR); 

ה לוּחַ שָׁנָה בכיתה מגדירות שתי שיטות:

  • setFirstDayOfWeek
  • setMinimalDaysInFirstWeek

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

2.3. אזור הבדלים

המקומיות ממלאות תפקיד חשוב בחישוב מספר השבוע:

@Test ציבור בטל givenDateUsingFieldsAndLocaleCanada_whenGetWeekNumber_thenWeekIsReturnedCorrectly () {לוח שנה לוח שנה = Calendar.getInstance (Locale.CANADA); לוח שנה.סט (2020, 10, 22); assertEquals (48, calendar.get (Calendar.WEEK_OF_YEAR)); } 

במבחן יחידה זה שינינו רק את אזור ה- לוּחַ שָׁנָה להשתמש אזור. CANADA במקום אזור. ITALY ועכשיו מספר השבוע שהוחזר הוא 48 במקום 47.

שתי התוצאות נכונות. כאמור, זה קורה בגלל שכל אחד מהם אזור יש הגדרות שונות עבור setFirstDayOfWeek ו setMinimalDaysInFirstWeek שיטות.

3. ג'אווה 8 תאריך שעה ממשק API

Java 8 הציגה ממשקי API חדשים עבור תַאֲרִיך ו זְמַן כדי לטפל בחסרונות של המבוגרים java.util.Date ו java.util.Calendar.

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

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

כמו כן, כפי שראינו קודם עם לוּחַ שָׁנָה, אנו יכולים גם להעביר ערכי שנה, חודש ויום ישירות ל LocalDate:

תאריך LocalDate = LocalDate.of (שנה, חודש, יום); int weekOfYear = date.get (WeekFields.of (locale) .weekOfYear ()); 

היתרון על הדוגמאות שלנו לפני Java 8 הוא שאין לנו את הבעיה ששדה החודש מבוסס על אפס.

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

בדוגמה אחרונה זו נראה כיצד להשתמש ב- ChronoField ספירה, המיישמת את TemporalField מִמְשָׁק:

תאריך LocalDate = LocalDate.of (שנה, חודש, יום); int weekOfYear = date.get (ChronoField.ALIGNED_WEEK_OF_YEAR); 

דוגמה זו דומה לשימוש ב- לוח שנה.WEEK_OF_YEARint קבוע שראינו בעבר, אך השתמשנו בו ChronoField.ALIGNED_WEEK_OF_YEAR.

4. מסקנה

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

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


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