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
การที่เราเรียกไม่เปลี่ยนแปลง เมธอดจะส่งคืนวัตถุใหม่ที่มีข้อมูลที่ต้องการแทน