JavaRush /בלוג Java /Random-HE /איך לא ללכת לאיבוד בזמן - DateTime ולוח שנה

איך לא ללכת לאיבוד בזמן - DateTime ולוח שנה

פורסם בקבוצה
שלום! היום נתחיל לעבוד עם סוג נתונים חדש שלא נתקלנו בו בעבר, כלומר תאריכים. איך לא ללכת לאיבוד בזמן - DateTime ולוח שנה - 1אני חושב שאין צורך להסביר מה זה תאריך :) באופן עקרוני, בהחלט אפשרי לכתוב את התאריך והשעה הנוכחיים בג'אווה במחרוזת רגילה.
public class Main {
   public static void main(String[] args) {

       String date = "June 11, 2018";
       System.out.println(date);
   }
}
אבל לגישה זו יש חסרונות רבים. הכיתה Stringנוצרה לעבודה עם טקסט, ויש לה שיטות מתאימות. אם אנחנו צריכים איכשהו לנהל את התאריך (להוסיף לו שעתיים, למשל), זה Stringלא יעבוד כאן. או, למשל, הצג את התאריך והשעה הנוכחיים בזמן הידור של התוכנית לתוך המסוף. גם כאן זה לא יעזור String: בזמן שאתה כותב את הקוד ומפעיל אותו, השעה תשתנה והלא רלוונטי יוצג בקונסולה. לכן, בג'אווה, יוצריה סיפקו מספר שיעורים לעבודה עם תאריכים ושעות. הראשון הוא שיעורjava.util.Date

שיעור תאריך ג'אווה

נתנו לו את השם המלא כי יש גם מחלקה בחבילה אחרת בג'אווה java.sql.Date. אל תתבלבלו! הדבר הראשון שאתה צריך לדעת עליו הוא שהוא מאחסן את התאריך באלפיות שניות שחלפו מאז 1 בינואר 1970. יש אפילו שם נפרד לתאריך הזה - "זמן יוניקס". דרך מעניינת למדי, אתה מסכים? :) הדבר השני שצריך לזכור: אם אתה יוצר אובייקט Dateעם בנאי ריק, התוצאה תהיה התאריך והשעה הנוכחיים בזמן יצירת האובייקט . Stringאתה זוכר איך כתבנו שמשימה כזו תהיה בעייתית עבור פורמט תאריך ? הכיתה Dateפותרת את זה בקלות.
public class Main {
   public static void main(String[] args) {

       Date date = new Date();
       System.out.println(date);
   }
}
הפעילו את הקוד הזה מספר פעמים ותראו איך השעה תשתנה בכל פעם :) זה אפשרי בדיוק בגלל שהוא מאוחסן באלפיות שניות: הן יחידת הזמן הקטנה ביותר, ולכן התוצאות כל כך מדויקות. יש בנאי נוסף עבור Date: אתה יכול לציין את המספר המדויק של אלפיות השנייה שעברו מ-00:00 1 בינואר 1970 לתאריך הנדרש, והוא ייווצר:
public class Main {
   public static void main(String[] args) {

       Date date = new Date(1212121212121L);
       System.out.println(date);
   }
}
פלט מסוף:

Fri May 30 08:20:12 MSD 2008
קיבלנו את זה ב-30 במאי 2008. "שי" פירושו היום בשבוע - "שישי" (שישי), ו-MSD - "שעון קיץ במוסקבה" (שעון קיץ במוסקבה). אלפיות השניות משודרות בפורמט long, מכיוון שמספרן לרוב אינו מתאים ל int. אז, איזה סוג של פעולות דייט אנחנו עשויים להזדקק לעבודה שלנו? ובכן, הדבר הברור ביותר, כמובן, הוא השוואה . קבע אם תאריך אחד היה מאוחר או מוקדם יותר מאחר. זה יכול להיעשות בדרכים שונות. לדוגמה, אתה יכול לקרוא לשיטת . Date.getTime(), שתחזיר את מספר האלפיות השניות שחלפו מאז חצות ב-1 בינואר 1970. בואו פשוט נקרא לזה על שני אובייקטי תאריך ונשווה אותם אחד עם השני:
public class Main {
   public static void main(String[] args) {

       Date date1 = new Date();

       Date date2 = new Date();

       System.out.println((date1.getTime() > date2.getTime())?
               "date1 is later than date2" : "date1 is earlier than date2");
   }
}
סיכום:

date1 раньше date2
אבל יש דרך נוחה יותר, כלומר, להשתמש בשיטות מיוחדות של המחלקה Date: before(), after()ו equals(). כולם מחזירים את התוצאה ב boolean. השיטה before()בודקת אם הדייט שלנו מוקדם מזה שאנו מעבירים כטיעון:
public class Main {
   public static void main(String[] args) throws InterruptedException {

       Date date1 = new Date();

       Thread.sleep(2000);//pause the program for 2 seconds
       Date date2 = new Date();

       System.out.println(date1.before(date2));
   }
}
פלט מסוף:

true
השיטה פועלת בצורה דומה after(); היא בודקת אם הדייט שלנו היה מאוחר מזה שאנו מעבירים כטיעון:
public class Main {
   public static void main(String[] args) throws InterruptedException {

       Date date1 = new Date();

       Thread.sleep(2000);//pause the program for 2 seconds
       Date date2 = new Date();

       System.out.println(date1.after(date2));
   }
}
פלט מסוף:

false
בדוגמאות שלנו, אנו משכבים את התוכנית למשך 2 שניות כך ששני התאריכים מובטחים שונים. במחשבים מהירים, הזמן בין יצירה date1לבין date2יכול להיות פחות מאלפית שנייה אחת, ובמקרה זה גם before()וגם after()יחזרו false. אבל השיטה equals()במצב כזה תחזור true! אחרי הכל, הוא משווה בדיוק את מספר האלפיות השניות שחלפו מאז 00:00 1 בינואר 1970 עבור כל תאריך. אובייקטים ייחשבו שווים רק אם הם תואמים עד אלפית השנייה:
public static void main(String[] args) {

   Date date1 = new Date();
   Date date2 = new Date();

   System.out.println(date1.getTime());
   System.out.println(date2.getTime());

   System.out.println(date1.equals(date2));
}
הנה עוד משהו שאתה צריך לשים לב אליו. אם תפתח את התיעוד של המחלקה Dateבאתר אורקל, תראה שרבים מהשיטות והבנאים שלה סומנו כ- Deprecated("הוצא משימוש"). הנה, תראה: תאריך שיעור הנה מה שיוצרי ג'אווה עצמם אומרים על אותם חלקים של מחלקות שהוצאו משימוש: "רכיב תוכנית עם הערות ב-@Deprecated הוא משהו שמתכנתים לא מעודדים להשתמש בו, בדרך כלל בגלל שהוא מסוכן, או בגלל ש יש אלטרנטיבה טובה יותר". זה לא אומר שאי אפשר להשתמש בשיטות האלה בכלל. יתרה מכך, אם אתה בעצמך מנסה להריץ את הקוד באמצעותם ב-IDEA, סביר להניח שזה יעבוד.בוא ניקח לדוגמא את השיטה המודחית Date.getHours(), שמחזירה את מספר השעות מהאובייקט Date.
public static void main(String[] args) {

   Date date1 = new Date();

   System.out.println(date1.getHours());

}
אם בזמן שאתה מריץ את הקוד, למשל, השעה היא 14:21, הוא יציג את המספר 14. כפי שאתה יכול לראות, השיטה שהוצאה משימוש מחוצה, אבל היא עובדת די טוב. שיטות אלה לא הוסרו לחלוטין, כדי לא לשבור חבורה של קוד שכבר נכתב באמצעותן. כלומר, שיטות אלו אינן "שבורות" או "מוסרות", הן פשוט אינן מומלצות לשימוש בשל הזמינות של חלופה נוחה יותר. אגב, כתוב על זה ממש בתיעוד: Как не потеряться во времени — DateTime и Calendar - 2רוב השיטות של מחלקת Date הועברו לגרסה המשופרת והמורחבת שלה - המחלקה Calendar. עוד נכיר אותו :)

לוח שנה של Java

Java 1.1 הציגה מחלקה חדשה - Calendar. הוא הפך את העבודה עם תאריכים ב-Java לקצת יותר קלה ממה שזה נראה קודם. היישום היחיד של הכיתה Calendarאיתה נעבוד הוא הכיתה GregorianCalendar(היא מיישמת את הלוח הגרגוריאני, שלפיו חיות רוב מדינות העולם). הנוחות העיקרית שלו היא שהוא יכול לעבוד עם תאריכים בפורמט נוח יותר. לדוגמה, הוא יכול:
  • הוסף חודש או יום לתאריך הנוכחי
  • בדוק אם השנה היא שנה מעוברת;
  • קבל רכיבי תאריך בודדים (לדוגמה, קבל את מספר החודש מתאריך שלם)
  • וגם, פותחה בתוכו מערכת נוחה מאוד של קבועים (נראה רבים מהם בהמשך).
הבדל חשוב נוסף של הכיתה Calendarהוא שהיא מיישמת קבוע Calendar.Era: אתה יכול להגדיר את התאריך לעידן לפני הספירה ( "לפני ישו" - לפני הולדת ישו, כלומר "לפני עידן שלנו") או AC ("אחרי ישו" - " העידן שלנו"). בואו נסתכל על כל זה עם דוגמאות. בואו ניצור לוח שנה עם התאריך 25 בינואר 2017:
public static void main(String[] args) {

  Calendar calendar = new GregorianCalendar(2017, 0 , 25);
}
חודשים בכיתה Calendar(כמו ב- Date, אגב) מתחילים מאפס, אז העברנו את המספר 0 כארגומנט השני. העיקר כשעובדים עם כיתה Calendarהוא להבין שזהו לוח שנה , ולא תאריך נפרד. Как не потеряться во времени — DateTime и Calendar - 3תאריך הוא פשוט סדרה של מספרים המייצגים פרק זמן מסוים. ולוח שנה הוא מכשיר שלם שאפשר לעשות איתו הרבה דברים עם תאריכים :) אפשר לראות את זה די בבירור אם מנסים להוציא את אובייקט Calendar לקונסולה: פלט:

java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Moscow",offset=10800000,dstSavings=0,useDaylight=false,transitions=79,lastRule=null],firstDayOfWeek=2,minimalDaysInFirstWeek=1,ERA=?,YEAR=2017,MONTH=0,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=25,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=?,ZONE_OFFSET=?,DST_OFFSET=?]
תראה כמה מידע יש! ללוח השנה יש חבורה של מאפיינים שאין לתאריך רגיל, וכולם מופקים לקונסולה (כך עובדת השיטה toString()במחלקה Calendar). אם, בזמן העבודה, אתה רק צריך לקבל תאריך פשוט מהלוח שנה, כלומר. אובייקט Date- זה נעשה באמצעות שיטה Calendar.getTime()(השם הוא לא הכי הגיוני, אבל שום דבר לא ניתן לעשות):
public static void main(String[] args) {

   Calendar calendar = new GregorianCalendar(2017, 0 , 25);
   Date date = calendar.getTime();
   System.out.println(date);
}
סיכום:

Wed Jan 25 00:00:00 MSK 2017
כעת "פישטנו" את לוח השנה לתאריך קבוע. בוא נמשיך הלאה. בנוסף לסמלים מספריים במשך חודשים, Calendarניתן להשתמש בקבועים בכיתה. קבועים הם שדות סטטיים של מחלקה Calendarעם ערך מוגדר שכבר אינו ניתן לשינוי. אפשרות זו למעשה טובה יותר, מכיוון שהיא משפרת את קריאות הקוד.
public static void main(String[] args) {
   GregorianCalendar calendar = new GregorianCalendar(2017, Calendar.JANUARY , 25);
}
Calendar.JANUARY- אחד הקבועים לציון החודש. עם אפשרות מתן שמות זו, אף אחד לא ישכח, למשל, שהמספר "3" אומר אפריל, ולא החודש השלישי שאנחנו רגילים אליו - מרץ. אתה פשוט כותב Calendar.APRIL- וזהו :) כל שדות לוח השנה (יום, חודש, דקות, שניות וכו') ניתנים להגדרה בנפרד בשיטה set(). זה מאוד נוח, מכיוון Calendarשלכל שדה יש ​​קבוע משלו בכיתה, והקוד הסופי ייראה פשוט ככל האפשר. לדוגמה, בדוגמה הקודמת, יצרנו תאריך, אך לא הגדרנו עבורו את השעה הנוכחית. בואו נקבע את השעה ל-19:42:12
public static void main(String[] args) {
   Calendar calendar = new GregorianCalendar();
   calendar.set(Calendar.YEAR, 2017);
   calendar.set(Calendar.MONTH, 0);
   calendar.set(Calendar.DAY_OF_MONTH, 25);
   calendar.set(Calendar.HOUR_OF_DAY, 19);
   calendar.set(Calendar.MINUTE, 42);
   calendar.set(Calendar.SECOND, 12);

   System.out.println(calendar.getTime());
}
סיכום:

Wed Jan 25 19:42:12 MSK 2017
אנו קוראים למתודה set(), מעבירים אליה קבוע (בהתאם לשדה שאנו רוצים לשנות) וערך חדש לשדה זה. מסתבר שהשיטה set()היא סוג של "סופר-מגדיר" שיכול להגדיר ערך לא לשדה אחד, אלא לשדות רבים :) הוספה והפחתה של ערכים במחלקה Calendarמתבצעת באמצעות ה- add(). אתה צריך להעביר לתוכו את השדה שאתה רוצה לשנות, ואת המספר - בדיוק כמה אתה רוצה להוסיף/להחסיר מהערך הנוכחי. לדוגמה, בוא נגדיר את התאריך שיצרנו לפני חודשיים:
public static void main(String[] args) {
   Calendar calendar = new GregorianCalendar(2017, Calendar.JANUARY , 25);
   calendar.set(Calendar.HOUR, 19);
   calendar.set(Calendar.MINUTE, 42);
   calendar.set(Calendar.SECOND, 12);

   calendar.add(Calendar.MONTH, -2);//to subtract a value - a negative number must be passed to the method
   System.out.println(calendar.getTime());
}
סיכום:

Fri Nov 25 19:42:12 MSK 2016
גדול! החזרנו את התאריך לפני חודשיים. כתוצאה מכך, לא רק החודש, אלא גם השנה השתנתה, מ-2017 ל-2016. חישוב השנה הנוכחית בעת העברת תאריכים, כמובן, מתבצע באופן אוטומטי ואין צורך בשליטה ידנית. אבל אם למטרה כלשהי אתה צריך להשבית התנהגות זו, אתה יכול לעשות זאת. שיטה מיוחדת roll()יכולה להוסיף ולהחסיר ערכים מבלי להשפיע על ערכים אחרים. לדוגמה, כך:
public static void main(String[] args) {
   Calendar calendar = new GregorianCalendar(2017, Calendar.JANUARY , 25);
   calendar.set(Calendar.HOUR, 10);
   calendar.set(Calendar.MINUTE, 42);
   calendar.set(Calendar.SECOND, 12);

   calendar.roll(Calendar.MONTH, -2);
   System.out.println(calendar.getTime());
}
עשינו בדיוק אותו דבר כמו בדוגמה הקודמת - הורדנו 2 חודשים מהתאריך הנוכחי. אבל עכשיו הקוד עבד אחרת: החודש השתנה מינואר לנובמבר, אבל השנה נשארה זהה ל-2017! סיכום:

Sat Nov 25 10:42:12 MSK 2017
נוסף. Calendarכפי שאמרנו לעיל, ניתן לקבל את כל השדות של אובייקט בנפרד. השיטה אחראית לכך get():
public static void main(String[] args) {
   GregorianCalendar calendar = new GregorianCalendar(2017, Calendar.JANUARY , 25);
   calendar.set(Calendar.HOUR, 10);
   calendar.set(Calendar.MINUTE, 42);
   calendar.set(Calendar.SECOND, 12);

   System.out.println("Year: " + calendar.get(Calendar.YEAR));
   System.out.println("Month: " + calendar.get(Calendar.MONTH));
   System.out.println("Number of the week in the month: " + calendar.get(Calendar.WEEK_OF_MONTH));// serial number of the week in the month

   System.out.println("Number: " + calendar.get(Calendar.DAY_OF_MONTH));

   System.out.println("Watch: " + calendar.get(Calendar.HOUR));
   System.out.println("Minutes: " + calendar.get(Calendar.MINUTE));
   System.out.println("Seconds: " + calendar.get(Calendar.SECOND));
   System.out.println("Milliseconds: " + calendar.get(Calendar.MILLISECOND));

}
סיכום:

Год: 2017 
Месяц: 0 
Порядковый номер недели в месяце: 4 
Число: 25 
Часы: 10 
Минуты: 42 
Секунды: 12 
Миллисекунды: 0
כלומר, בנוסף ל"סופר-מגדיר" בכיתה Calendarיש גם "סופר-גטר" :) נקודה מעניינת נוספת היא כמובן העבודה עם תקופות. כדי ליצור תאריך "לפני הספירה" אתה צריך להשתמש בשדה. Calendar.Era לדוגמה, בואו ניצור תאריך המציין את קרב קנאה, בו חניבעל הביס את צבא רומא. זה קרה ב-2 באוגוסט 216 לפני הספירה. ה.:
public static void main(String[] args) {
   GregorianCalendar cannes = new GregorianCalendar(216, Calendar.AUGUST, 2);
   cannes.set(Calendar.ERA, GregorianCalendar.BC);

   DateFormat df = new SimpleDateFormat("dd MMM yyy GG");
   System.out.println(df.format(cannes.getTime()));
}
כאן השתמשנו בכיתה SimpleDateFormatכדי להציג את התאריך בפורמט שמובן לנו יותר (האותיות "GG" אחראיות להצגת העידן). סיכום:

02 авг 216 до н.э.
Calendarיש עוד הרבה שיטות וקבועים בכיתה , קרא עליהם בתיעוד:

המרת מחרוזת לתאריך

כדי להמיר מחרוזת לתאריך, אתה יכול להשתמש במחלקת העזר של Java SimpleDateFormat . זה השיעור שאתה צריך כדי להמיר תאריך לפורמט שאתה מגדיר. Как не потеряться во времени — DateTime и Calendar - 5בתורו, זה דומה מאוד ל- DateFormat . ההבדל הבולט היחיד בין השניים הוא שניתן להשתמש ב-SimpleDateFormat לעיצוב (המרת תאריך למחרוזת) וניתוח המחרוזת לתאריך מודע למיקום, בעוד ש-DateFormat אינו תומך במיקום. בנוסף, DateFormat היא מחלקה מופשטת המספקת תמיכה בסיסית לעיצוב וניתוח תאריכים, בעוד SimpleDateFormat היא מחלקה קונקרטית שמרחיבה את המחלקה DateFormat. כך נראית דוגמה ליצירת אובייקט SimpleDateFormat ועיצוב תאריך:
SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(1212121212121L);

System.out.println(formatter.format(date));
בדוגמה שלמעלה השתמשנו בתבנית "yyyy-MM-dd HH:mm:ss" שפירושו:
  • 4 ספרות לשנה (yyyy);
  • 2 ספרות עבור חודש (MM);
  • 2 ספרות ליום (dd);
  • 2 ספרות לשעות בפורמט של 24 שעות (HH);
  • 2 ספרות לדקות (מ"מ);
  • 2 ספרות למשך שניות (ss).
סימני ההפרדה וסדר סמלי הדפוס נשמרים. פלט מסוף:
2008-05-30 08:20:12
יש די הרבה אותיות תבניות למחלקה SimpleDateFormat . כדי שלא תתבלבלו, אספנו אותם בטבלה:
סֵמֶל תיאור דוגמא
G עידן (בלוקליזציה באנגלית - לספירה ולפנה"ס) מוֹדָעָה
y שנה (מספר בן 4 ספרות) 2020
yy שנה (2 הספרות האחרונות) 20
yyyy שנה (מספר בן 4 ספרות) 2020
M מספר חודש (ללא אפסים מובילים) 8
מ.מ מספר חודש (עם אפסים מובילים אם מספר חודש < 10) 04
MMM קיצור של שלוש אותיות חודש (לפי לוקליזציה) ינואר
ממממ שם חודש מלא יוני
w שבוע בשנה (ללא אפסים מובילים) 4
ww שבוע בשנה (עם אפסים מובילים) 04
W שבוע בחודש (ללא אפסים מובילים) 3
WW שבוע בחודש (עם אפס מוביל) 03
ד יום בשנה 67
ד יום בחודש (ללא אפסים מובילים) 9
dd יום בחודש (עם אפסים מובילים) 09
ו יום בשבוע בחודש (ללא אפסים מובילים) 9
FF יום בשבוע בחודש (עם אפסים מובילים) 09
ה יום בשבוע (קיצור) W
EEEE יום בשבוע (מלא) יוֹם שִׁישִׁי
u מספר יום בשבוע (ללא אפסים מובילים) 5
uu מספר היום בשבוע (עם אפסים מובילים) 05
א סמן AM/PM א.מ.
ח שעות בפורמט של 24 שעות ללא אפסים מובילים 6
HH שעון בפורמט של 24 שעות עם אפס מוביל 06
ק מספר שעות בפורמט של 24 שעות 18
ק מספר שעות בפורמט של 12 שעות 6
ח זמן בפורמט של 12 שעות ללא אפסים מובילים 6
חח זמן בפורמט של 12 שעות עם אפס מוביל 06
M דקות ללא אפסים מובילים 32
מ"מ דקות עם אפס מוביל 32
ס שניות ללא אפסים מובילים אחד עשר
ss שניות עם אפס מוביל אחד עשר
ס אלפיות השנייה 297
ז אזור זמן EET
ז אזור זמן בפורמט RFC 822 300
דוגמאות לשילובי תווים של דפוסים:
לִטעוֹם דוגמא
dd-MM-yyyy 01-11-2020
yyyy-MM-dd 2019-10-01
HH:mm:ss.SSS 23:59.59.999
yyyy-MM-dd HH:mm:ss 30-11-2018 03:09:02
yyyy-MM-dd HH:mm:ss.SSS 2016-03-01 01:20:47.999
yyyy-MM-dd HH:mm:ss.SSS Z 2013-13-13 23:59:59.999 +0100
אם אתה עושה טעות קלה בפורמט, אתה יכול להפוך לבעלים של java.text.ParseException, וזה לא הישג נעים במיוחד. ובכן, הטיול הקצר לתוך SimpleDateFormat הסתיים - בואו נחזור לתרגום של מחרוזת java עד היום . SimpleDateFormat נותן לנו יכולות כאלה, ונעבור את התהליך הזה צעד אחר צעד.
  1. צור שורה שממנה אתה צריך להגדיר את התאריך:

    String strDate = "Sat, April 4, 2020";
  2. אנו יוצרים אובייקט SimpleDateFormat חדש עם תבנית התואמת למה שיש לנו במחרוזת (אחרת לא נוכל לנתח אותה):

    SimpleDateFormat formatter = new SimpleDateFormat("EEE, MMMM d, yyyy", Locale.ENGLISH);

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

    אם המקום אינו תואם למחרוזת הקלט, אז נתוני מחרוזת המחוברים לשפה, כמו שלנו Mon או April , לא יזוהו ויזרקו java.text.ParseException, גם אם התבנית תואמת.

    עם זאת, איננו צריכים לציין את הפורמט אם אנו משתמשים בתבנית שאינה ספציפית לשפה. כדוגמה - yyyy-MM-dd HH:mm:ss

  3. אנו יוצרים תאריך באמצעות פורמט, אשר בתורו מנתח אותו ממחרוזת הקלט:

    try {
      Date date = formatter.parse(strDate);
      System.out.println(date);
    }
    catch (ParseException e) {
      e.printStackTrace();
    }

    פלט מסוף:

    
    Sat Apr 04 00:00:00 EEST 2020

    המממ... אבל הפורמט כבר לא אותו דבר!

    כדי ליצור את אותו פורמט, אנו משתמשים שוב בפורמט:

    System.out.println(formatter.format(date));

    פלט מסוף:

    
    Sat, April 4, 2020

SimpleDateFormat ולוח שנה

SimpleDateFormat מאפשר לך לעצב את כל אובייקטי התאריך והיומן שאתה יוצר לשימוש מאוחר יותר. בואו ניקח בחשבון נקודה מעניינת כמו עבודה עם תקופות. כדי ליצור תאריך "לפני הספירה", אתה צריך להשתמש בשדה Calendar.Era. לדוגמה, בואו ניצור תאריך המציין את קרב קנאה, שבו חניבעל הביס את צבא רומא. זה קרה ב-2 באוגוסט 216 לפני הספירה. ה.:
public static void main(String[] args) {
   GregorianCalendar cannes = new GregorianCalendar(216, Calendar.AUGUST, 2);
   cannes.set(Calendar.ERA, GregorianCalendar.BC);

   DateFormat df = new SimpleDateFormat("dd MMM yyy GG");
   System.out.println(df.format(cannes.getTime()));
}
כאן השתמשנו במחלקה SimpleDateFormat כדי להציג את התאריך בפורמט שמובן לנו יותר (כפי שצוין למעלה, האותיות "GG" אחראיות להצגת העידן). סיכום:

02 авг 216 до н.э.

פורמט תאריך Java

הנה עוד מקרה. בואו נניח שפורמט התאריך הזה לא מתאים לנו:

Sat Nov 25 10:42:12 MSK 2017
אז הנה זה. באמצעות היכולות שלנו בפורמט תאריך ג'אווה, אתה יכול לשנות אותו לשלך ללא קושי רב:
public static void main(String[] args) {

   SimpleDateFormat dateFormat = new SimpleDateFormat("EEEE, d MMMM yyyy");
   Calendar calendar = new GregorianCalendar(2017, Calendar.JANUARY , 25);
   calendar.set(Calendar.HOUR, 10);
   calendar.set(Calendar.MINUTE, 42);
   calendar.set(Calendar.SECOND, 12);

   calendar.roll(Calendar.MONTH, -2);
   System.out.println(dateFormat.format(calendar.getTime()));
}
סיכום:

суббота, 25 Ноябрь 2017
הרבה יותר טוב, נכון? :)
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION