1. ขอแนะนำ Date Time API

ผู้สร้าง Java ไม่ชอบสถานการณ์กับคลาสวันที่และปฏิทิน พวกเขาดีในวันของพวกเขา แต่เวลาเปลี่ยนไป และบางสิ่งที่เรียบง่าย ทรงพลัง และเชื่อถือได้กลายเป็นสิ่งจำเป็น และด้วยการเปิดตัว Java 8 (15 ปีหลังจากCalendarเปิดตัว) จึงเปิดตัวJava Date Time API เป็นชุดของชั้นเรียนที่ควรจะสามารถแก้ไขทุกงานที่เกี่ยวข้องกับเวลาได้
มีคลาสมากมายที่แบ่งออกเป็นหลายแพ็คเกจ:
แพ็คเกจjava.timeเป็นแพ็คเกจพื้นฐานสำหรับ Java Date Time API: ประกอบด้วยคลาสเช่นLocalDate, LocalTime, LocalDateTime, Instant, Period, Durationและ วัตถุทั้งหมดของคลาสเหล่านี้คือimmutableซึ่งหมายความว่าไม่สามารถเปลี่ยนแปลงได้หลังจากสร้าง
แพ็คเกจjava.time.formatประกอบด้วยคลาสสำหรับการจัดรูปแบบเวลา เช่น การแปลงเวลา (และวันที่) เป็นสตริง และในทางกลับกัน ตัวอย่างเช่น มีDateTimeFormatterคลาสอเนกประสงค์ซึ่งแทนที่SimpleDateFormatคลาส
แพ็คเกจjava.time.zoneประกอบด้วยคลาสสำหรับการทำงานกับโซนเวลา มันมี คลาสเช่นTimeZoneและ ZonedDateTimeหากคุณกำลังเขียนโค้ดเซิร์ฟเวอร์สำหรับไคลเอนต์ที่อยู่ในส่วนต่างๆ ของโลก คุณจำเป็นต้องมีคลาสเหล่านี้จริงๆ
2. LocalDateชั้นเรียน
คลาสแรกและมีประโยชน์มากที่สุดจาก Date Time API ที่เราจะพิจารณาคือLocalDateคลาส คุณอาจเดาได้จากชื่อคลาสนี้ คลาสนี้ออกแบบมาเพื่อใช้กับวันที่
ออบเจกต์ของคลาสนี้จะไม่เปลี่ยนแปลงหลังจากสร้างแล้ว กล่าวคือLocalDateคลาสนี้เปลี่ยนรูปไม่ได้ แต่คุณสมบัตินี้เพิ่มความเรียบง่ายและความน่าเชื่อถือให้กับชั้นเรียน โดยเฉพาะอย่างยิ่งหากหลายเธรด (เธรดการดำเนินการ) กำลังโต้ตอบกับวัตถุดังกล่าวในเวลาเดียวกัน
หากต้องการสร้างวัตถุใหม่LocalDateคุณต้องใช้หนึ่งในวิธีคงที่ นี่คือรายการหลัก
รับวันที่ปัจจุบัน
ในการรับวันที่ปัจจุบัน คุณต้องใช้now()วิธี คงที่ มันง่ายกว่าที่คิด:
LocalDate today = LocalDate.now();
todayตัวแปร อยู่ที่ไหนLocalDateและLocalDate.now()เป็นการเรียกเมธอดnow()แบบสแตติกของLocalDateคลาส
ตัวอย่าง:
| รหัส | เอาต์พุตคอนโซล |
|---|---|
|
|
รับวันที่ในเขตเวลาที่กำหนด
คลาส นี้LocalDateยังมีรูปแบบต่างๆ ของnow(ZoneId)วิธีการที่ช่วยให้คุณได้รับวันที่ปัจจุบันในเขตเวลาที่กำหนด
ในการทำเช่นนี้ เราต้องการคลาสอื่น — ZoneIdคลาส (java.time.ZoneId) มีof()เมธอดที่ส่งคืนZoneIdออบเจกต์ตามชื่อเขตเวลา
ในการกำหนดวันที่ปัจจุบันใน Shanghai คุณต้องเขียนรหัสต่อไปนี้:
| รหัส | เอาต์พุตคอนโซล |
|---|---|
|
|
คุณสามารถค้นหารายชื่อโซนเวลาทั้งหมดบนอินเทอร์เน็ต
3. รับวันที่เฉพาะ
ในการรับLocalDateวัตถุที่แสดงถึงวันที่เฉพาะ คุณต้องใช้of()เมธอด แบบสแตติก ทุกอย่างที่นี่เรียบง่ายและชัดเจนมาก:
LocalDate date = LocalDate.of(2019, Month.FEBRUARY, 22);
dateตัวแปร อยู่ที่ไหนLocalDateและเป็นการเรียกเมธอดแบบสแตติกของคลาสLocalDate.of()of()LocalDate
ที่นี่เราเห็นFEBRUARYค่าคงที่ของMonthคลาส (java.time.Month) ถูกใช้เพื่อระบุเดือนกุมภาพันธ์เป็นเดือน
คุณยังสามารถระบุเดือนด้วยวิธีแบบเก่า โดยใช้ตัวเลข:
LocalDate date = LocalDate.of(2019, 2, 22);
สอง? แทนที่จะเป็นเดือนกุมภาพันธ์? หมายความว่าเดือนจะถูกนับอีกครั้งจากหนึ่ง?
ใช่ เกือบ 20 ปีหลังจากการสร้าง Java ในที่สุดเดือนก็หยุดนับจากศูนย์
ตัวอย่าง:
| รหัส | เอาต์พุตคอนโซล |
|---|---|
|
|
รับวันที่ตามดัชนีของวัน
มีอีกวิธีหนึ่งที่น่าสนใจในการสร้างวันที่: เมื่อใช้ofYearDayวิธีนี้ คุณจะได้วันที่ตามจำนวนปีและดัชนีของวันในปีเท่านั้น นี่คือลักษณะทั่วไป:
LocalDate date = LocalDate.ofYearDay(year, day);
yearหมายเลขของปีอยู่ที่ไหน และ dayเป็นดัชนีของวันในปี
ตัวอย่าง:
| รหัส | เอาต์พุตคอนโซล |
|---|---|
|
|
วันที่ 100 ของปี 2019 คือวันที่ 10 เมษายน
รับวันที่ Unix
คุณจำได้ไหมว่าDateวัตถุมักจะเก็บเวลาเป็นมิลลิวินาทีตั้งแต่วันที่ 1 มกราคม 1970 เพื่อให้แน่ใจว่าโปรแกรมเมอร์จะไม่พลาดวันเก่าๆLocalDateชั้นเรียนมีofEpochDay()เมธอดที่จะส่งคืนวันที่ที่คำนวณจากวันที่ 1 มกราคม 1970 นี่คือลักษณะทั่วไป:
LocalDate date = LocalDate.ofEpochDay(day);
dayจำนวนวันที่ผ่านไปตั้งแต่วันที่ 1 มกราคม พ.ศ. 2513 อยู่ที่ไหน
ตัวอย่าง:
| รหัส | เอาต์พุตคอนโซล |
|---|---|
|
|
4. รับองค์ประกอบของวันที่
เป็นไปไม่ได้ที่จะเปลี่ยนLocalDateวัตถุ แต่คุณสามารถรับองค์ประกอบแต่ละรายการของวันที่ที่จัดเก็บได้ LocalDateวัตถุมีหลายวิธีสำหรับสิ่งนี้:
| วิธี | คำอธิบาย |
|---|---|
|
ส่งกลับปีของวันที่ที่ระบุ |
|
ส่งกลับวันที่ของเดือน: หนึ่งในหลายค่าคงที่JANUARY, FEBRUARY, ...; |
|
ส่งกลับดัชนีของเดือนวันที่ มกราคม == 1. |
|
ส่งกลับดัชนีของวันของเดือน |
|
ส่งกลับดัชนีของวันตั้งแต่ต้นปี |
|
ส่งกลับวันในสัปดาห์: หนึ่งในค่าคงที่หลายๆ ค่าMONDAY, TUESDAY, ...; |
|
ส่งกลับยุค: อย่างใดอย่างหนึ่งBCE(ก่อนยุคปัจจุบัน) และCE(ยุคปัจจุบัน) |
ตัวอย่าง:
| รหัส | เอาต์พุตคอนโซล |
|---|---|
|
|
5. การเปลี่ยนวันที่ในLocalDateวัตถุ
ชั้นLocalDateเรียนประกอบด้วยวิธีการต่างๆ มากมายที่ช่วยให้คุณทำงานกับวันที่ได้ การนำเมธอดเหล่านี้ไปปฏิบัตินั้นคล้ายคลึงกับเมธอดของStringคลาส: พวกมันจะไม่เปลี่ยนLocalDateวัตถุที่มีอยู่ แต่จะส่งคืนอันใหม่พร้อมข้อมูลที่ต้องการแทน
นี่คือวิธีการของLocalDateชั้นเรียน:
| วิธี | คำอธิบาย |
|---|---|
|
เพิ่มจำนวนวันที่ระบุในวันที่ |
|
เพิ่มสัปดาห์ในวันที่ |
|
เพิ่มเดือนในวันที่ |
|
เพิ่มปีในวันที่ |
|
ลบวันออกจากวันที่ |
|
ลบสัปดาห์จากวันที่ |
|
ลบเดือนจากวันที่ |
|
ลบปีจากวันที่ |
ตัวอย่าง:
| รหัส | เอาต์พุตคอนโซล |
|---|---|
|
|
วิธีbirthday objectการที่เราเรียกไม่เปลี่ยนแปลง เมธอดจะส่งคืนวัตถุใหม่ที่มีข้อมูลที่ต้องการแทน
GO TO FULL VERSION