1. สลับจากDateชั้นเรียนไปยังCalendarชั้นเรียน

โปรแกรมเมอร์ชอบDateคลาสนี้เพราะความเรียบง่ายและการรองรับมาตรฐาน Unix แต่อย่างที่คุณทราบ กุหลาบทุกดอกมีหนาม

โปรแกรมเมอร์ต้องการDateคลาสที่ "ฉลาด" และพวกเขาได้สิ่งที่ต้องการในรูปแบบของCalendarชั้นเรียน มันถูกมองว่าเป็นวิธีที่ไม่เพียงแค่จัดเก็บวันที่เท่านั้น แต่ยังรวมถึงการดำเนินการที่ยากลำบากกับวันที่อีกด้วย

ชื่อเต็มของCalendarคลาสคือ java.util.Calendar อย่าลืมเพิ่มลงในคำสั่งนำเข้าหากคุณตัดสินใจที่จะใช้ในรหัสของคุณ

คุณสามารถสร้างCalendarวัตถุด้วยคำสั่งนี้:

Calendar date = Calendar.getInstance();

เมธอด สแตติกgetInstance()ของCalendarคลาสสร้างCalendarวัตถุที่เริ่มต้นด้วยวันที่ปัจจุบัน ปฏิทินที่คุณต้องการจะถูกสร้างขึ้นตามการตั้งค่าของคอมพิวเตอร์ที่ใช้งานโปรแกรม

หรือพูดให้ถูกคือ ปฏิทินที่คุณได้รับ... นั่นเป็นเพราะมนุษย์บนโลกไม่ได้ถูกจำกัดไว้เพียงปฏิทินเดียว พวกเขาใช้หลายอย่างแทน และเกือบทุกคนมีความเกี่ยวข้องกับบางศาสนาหรือบางประเทศ คลาสCalendarรองรับ 3 คลาส:

ปฏิทิน คำอธิบาย
ปฏิทินเกรกอเรียน ปฏิทินคริสเตียนเกรกอเรียน
ปฏิทินพุทธ ปฏิทินพุทธ
ปฏิทินจักรวรรดิญี่ปุ่น ปฏิทินจักรวรรดิญี่ปุ่น

แต่ก็มีปฏิทินจีนและอาหรับด้วย โดยพื้นฐานแล้ว การทำงานกับเวลานั้นไม่ง่ายอย่างที่คิด

ในปฏิทินจีน ปีอย่างเป็นทางการคือ 4716 ณ เวลาที่เขียนบทเรียนนี้ และตามปฏิทินมุสลิม ปีคือ 1398 ยินดีต้อนรับสู่โลกใบใหญ่ เพื่อนโปรแกรมเมอร์ของฉัน

2. การสร้างวัตถุปฏิทิน

เราจะใช้ปฏิทินเกรกอเรียนเนื่องจากเป็นปฏิทินที่พบมากที่สุดในโลก อย่างน้อยก็จนกว่าจีนจะซื้อ Oracle และทำให้ปฏิทินจีนเป็นปฏิทินหลัก

คุณสามารถสร้างวัตถุปฏิทินที่มีวันที่ใดก็ได้โดยใช้คำสั่งดังนี้:

Calendar date = new GregorianCalendar(year, month, day);

ใช่ คุณต้องเขียนGregorianCalendarทุกครั้ง แทนที่จะเป็นCalendarคุณยังสามารถเขียนได้GregorianCalendarซึ่งจะได้ผลเช่นกัน แต่การเขียนนั้นCalendarสั้นกว่า

ต้องเขียนปีเต็ม เช่น คุณไม่สามารถเขียน 19 แทน 2019 ได้ เดือนจะยังคงเป็นตัวเลขจากศูนย์ แต่ก่อนวันของเดือนไม่ได้นับจากศูนย์ เนิร์ด!

หากต้องการตั้งเวลาและวันที่ คุณต้องป้อนเวลาเป็นอาร์กิวเมนต์เพิ่มเติม:

... = new GregorianCalendar(year, month, day, hours, minutes, seconds);

คุณสามารถส่งผ่านหน่วยเป็นมิลลิวินาทีได้หากจำเป็น เป็นพารามิเตอร์หลังจากจำนวนวินาที

3. การแสดงวัตถุปฏิทินบนหน้าจอ

หากคุณเพียงแค่พิมพ์วัตถุปฏิทินบนหน้าจอ คุณจะไม่พอใจกับผลลัพธ์ที่ได้

รหัส
Calendar calendar = new GregorianCalendar(2019, 03, 12);
System.out.println(calendar);
เอาต์พุตคอนโซล
java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Helsinki",offset=7200000,dstSavings=3600000,useDaylight=true,transitions=118,lastRule=java.util.SimpleTimeZone[id=Europe/Helsinki,offset=7200000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=3600000,startTimeMode=2,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=3600000,endTimeMode=2]],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2019,MONTH=3,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=12,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=?]

สิ่งที่ต้องจำไว้ในที่นี้คือปฏิทินคือปฏิทิน ไม่ใช่วันที่มีการตั้งค่าทุกประเภทที่จะแสดงบนหน้าจอ

จะเป็นการเหมาะสมที่จะใช้SimpleDateFormatวัตถุเพื่อแสดงปฏิทิน แต่จนกว่าเราจะศึกษา คุณสามารถใช้เคล็ดลับชีวิตนี้ได้

Date date = calendar.getTime();

วัตถุCalendarสามารถแปลงเป็นDateวัตถุได้ง่าย และคุณรู้วิธีแสดงDateวัตถุ แล้ว คุณสามารถใช้รหัสเช่นนี้เพื่อแปลงCalendarวัตถุเป็นDate:

โดยใช้getTime()วิธีการ:

รหัส เอาต์พุตคอนโซล
Calendar calendar = new GregorianCalendar(2019, 03, 12);
System.out.println(calendar.getTime());
 Fri Apr 12 00:00:00 EEST 2019

นั่นเป็นเรื่องที่แตกต่างกันมากใช่ไหม

4. การทำงานกับองค์ประกอบของวันที่

ในการรับองค์ประกอบเฉพาะของวันที่ (เช่น ปี เดือน ...) Calendarคลาสมีget()วิธีการ เป็นวิธีเดียว แต่มีพารามิเตอร์:

int month = calendar.get(Calendar.MONTH);

calendarตัวแปร อยู่ที่ไหนCalendarและMONTHเป็นเขตข้อมูลคงที่ของCalendarคลาส

คุณส่งผ่านCalendarฟิลด์ค่าคงที่ของคลาสหนึ่งเป็นอาร์กิวเมนต์ไปยังgetเมธอด และคุณจะได้ค่าที่ต้องการเป็นผลลัพธ์

ตัวอย่าง

รหัส คำอธิบาย
Calendar calendar = Calendar.getInstance();

int era = calendar.get(Calendar.ERA);
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);

int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
int hour = calendar.get(Calendar.HOUR);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);


พ.ศ. (ก่อนหรือหลัง พ.ศ.)
ปี
เดือน
วันของเดือน

วันในสัปดาห์
ชั่วโมง
นาที
วินาที

หากต้องการเปลี่ยนองค์ประกอบของวันที่ ให้ใช้setวิธีการ:

calendar.set(Calendar.MONTH, value);

calendarตัวแปร อยู่ที่ไหนCalendarและMONTHเป็นเขตข้อมูลคงที่ของCalendarคลาส

เมื่อทำงานกับsetเมธอด คุณจะส่งผ่านฟิลด์ค่าคงที่ของคลาสหนึ่งCalendarเป็นอาร์กิวเมนต์แรก และค่าใหม่เป็นอาร์กิวเมนต์ที่สอง

ตัวอย่าง

รหัส คำอธิบาย
Calendar calendar = new GregorianCalendar();

calendar.set(Calendar.YEAR, 2019);
calendar.set(Calendar.MONTH, 6);
calendar.set(Calendar.DAY_OF_MONTH, 4);
calendar.set(Calendar.HOUR_OF_DAY, 12);
calendar.set(Calendar.MINUTE, 15);
calendar.set(Calendar.SECOND, 0);

System.out.println(calendar.getTime());


ปี = 2019
เดือน = กรกฎาคม (นับจาก 0)
วันที่ 4
ชั่วโมง
นาที
วินาที

5. ค่าคงที่ของCalendarคลาส

ฟิลด์ค่าคงที่ของCalendarคลาสไม่จำกัดเฉพาะฟิลด์สำหรับตั้งชื่ออิลิเมนต์ของวันที่ ดูเหมือนจะมีฟิลด์สำหรับทุกโอกาส

Calendar date = new GregorianCalendar(2019, Calendar.JANUARY, 31);

ตัวอย่างเช่น มีช่องคงที่สำหรับอ้างถึงเดือน:

และวันในสัปดาห์ด้วย:

Calendar calendar = new GregorianCalendar(2019, Calendar.JANUARY, 31);
if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY)
{
   System.out.println("It's Friday");
}

เราจะไม่แสดงรายการทุกอย่าง เราไม่อยากให้คุณแปลกใจถ้าคุณเห็นค่าคงที่แบบนี้ในโค้ด

การใช้ค่าคงที่ทำให้โค้ดอ่านง่ายขึ้น ซึ่งเป็นสาเหตุที่โปรแกรมเมอร์ใช้ และมีการนับเดือนจากศูนย์ด้วยเพื่อให้อ่านง่ายขึ้น หรือไม่.

6. การเปลี่ยนวันที่ในCalendarวัตถุ

ชั้นCalendarเรียนมีวิธีการที่ช่วยให้คุณจัดการวันที่ด้วยวิธีที่ชาญฉลาดยิ่งขึ้น ตัวอย่างเช่น คุณสามารถเพิ่มหนึ่งปี หนึ่งเดือน หรือหลายวันลงในวันที่ หรือเอาพวกมันออกไป วิธีนี้เรียกadd()ว่า การทำงานกับมันมีลักษณะดังนี้:

calendar.add(Calendar.MONTH, value);

calendarตัวแปร อยู่ที่ไหนCalendarและMONTHเป็นเขตข้อมูลคงที่ของCalendarคลาส

เมื่อทำงานกับaddเมธอด คุณจะส่งผ่านฟิลด์ค่าคงที่ของคลาสหนึ่งCalendarเป็นอาร์กิวเมนต์แรก และเป็นอาร์กิวเมนต์ที่สอง ซึ่งเป็นค่าใหม่ที่จะเพิ่ม

นี่เป็นอีกหนึ่งวิธีที่ชาญฉลาด มาดูกันว่ามันฉลาดแค่ไหน:

รหัส
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.add(Calendar.DAY_OF_MONTH, 2);
System.out.println(calendar.getTime());
เอาต์พุตคอนโซล
Fri Mar 01 00:00:00 EET 2019

วิธีนี้เข้าใจว่ากุมภาพันธ์ 2562 มีแค่ 28 วัน ผลคือวันที่ 1 มีนาคม

ตอนนี้มาใช้เวลา 2 เดือนกันเถอะ! เราควรได้อะไร? วันที่ 27 ธันวาคม 2561 ! มาตรวจสอบกัน

ในการดำเนินการที่ให้ผลลัพธ์ในวันที่ก่อนหน้า คุณต้องส่งค่าลบไปยังเมธอดadd():

รหัส
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.add(Calendar.MONTH, -2);
System.out.println(calendar.getTime());
เอาต์พุตคอนโซล
Thu Dec 27 00:00:00 EET 2018

มันได้ผล!

วิธีนี้จะพิจารณาระยะเวลาที่แตกต่างกันของเดือนและปีอธิกสุรทิน สรุปแล้วเป็นวิธีการที่ยอดเยี่ยม เป็นสิ่งที่โปรแกรมเมอร์ส่วนใหญ่ที่ทำงานเกี่ยวกับวันที่ต้องการอย่างแท้จริง

7. กลิ้งองค์ประกอบของวันที่

แต่บางครั้งก็มีบางสถานการณ์ที่เราไม่ต้องการพฤติกรรมอันชาญฉลาดนี้ เช่น คุณต้องการทำบางอย่างในช่วงหนึ่งของวันที่โดยไม่เปลี่ยนแปลงอย่างอื่น

ชั้นCalendarเรียนมีroll()วิธีการพิเศษสำหรับสิ่งนี้ ลายเซ็นของมันเหมือนกับadd()เมธอด แต่เมธอดนี้จะเปลี่ยนเพียงองค์ประกอบหนึ่งของวันที่ โดยปล่อยให้ส่วนที่เหลือไม่เปลี่ยนแปลง

ตัวอย่าง:

รหัส
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.roll(Calendar.MONTH, -2);
System.out.println(calendar.getTime());
เอาต์พุตคอนโซล
Fri Dec 27 00:00:00 EET 2019

เราเปลี่ยนเดือน แต่ปีและวันที่ยังคงไม่เปลี่ยนแปลง