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

ขอแนะนำ 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 today = LocalDate.now();
System.out.println("Today = " + today);

Today = 2019-02-22

รับวันที่ในเขตเวลาที่กำหนด

คลาส นี้LocalDateยังมีรูปแบบต่างๆ ของnow(ZoneId)วิธีการที่ช่วยให้คุณได้รับวันที่ปัจจุบันในเขตเวลาที่กำหนด

ในการทำเช่นนี้ เราต้องการคลาสอื่น — ZoneIdคลาส (java.time.ZoneId) มีof()เมธอดที่ส่งคืนZoneIdออบเจกต์ตามชื่อเขตเวลา

ในการกำหนดวันที่ปัจจุบันใน Shanghai คุณต้องเขียนรหัสต่อไปนี้:

รหัส เอาต์พุตคอนโซล
ZoneId  timezone = ZoneId.of("Asia/Shanghai");
LocalDate today = LocalDate.now(timezone);
System.out.println("In Shanghai, now = " + today);


In Shanghai, now = 2019-02-22

คุณสามารถค้นหารายชื่อโซนเวลาทั้งหมดบนอินเทอร์เน็ต


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 ในที่สุดเดือนก็หยุดนับจากศูนย์

ตัวอย่าง:

รหัส เอาต์พุตคอนโซล
LocalDate today = LocalDate.of(2019, 2, 22);
System.out.println("Today = " + today);

Today = 2019-02-22

รับวันที่ตามดัชนีของวัน

มีอีกวิธีหนึ่งที่น่าสนใจในการสร้างวันที่: เมื่อใช้ofYearDayวิธีนี้ คุณจะได้วันที่ตามจำนวนปีและดัชนีของวันในปีเท่านั้น นี่คือลักษณะทั่วไป:

LocalDate date = LocalDate.ofYearDay(year, day);

yearหมายเลขของปีอยู่ที่ไหน และ dayเป็นดัชนีของวันในปี

ตัวอย่าง:

รหัส เอาต์พุตคอนโซล
LocalDate today = LocalDate.ofYearDay(2019, 100);
System.out.println("Today = " + today);

Today = 2019-04-10

วันที่ 100 ของปี 2019 คือวันที่ 10 เมษายน

รับวันที่ Unix

คุณจำได้ไหมว่าDateวัตถุมักจะเก็บเวลาเป็นมิลลิวินาทีตั้งแต่วันที่ 1 มกราคม 1970 เพื่อให้แน่ใจว่าโปรแกรมเมอร์จะไม่พลาดวันเก่าๆLocalDateชั้นเรียนมีofEpochDay()เมธอดที่จะส่งคืนวันที่ที่คำนวณจากวันที่ 1 มกราคม 1970 นี่คือลักษณะทั่วไป:

LocalDate date = LocalDate.ofEpochDay(day);

dayจำนวนวันที่ผ่านไปตั้งแต่วันที่ 1 มกราคม พ.ศ. 2513 อยู่ที่ไหน

ตัวอย่าง:

รหัส เอาต์พุตคอนโซล
LocalDate today = LocalDate.ofEpochDay(1);
System.out.println("Today = " + today);

Today = 1970-01-02

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

เป็นไปไม่ได้ที่จะเปลี่ยนLocalDateวัตถุ แต่คุณสามารถรับองค์ประกอบแต่ละรายการของวันที่ที่จัดเก็บได้ LocalDateวัตถุมีหลายวิธีสำหรับสิ่งนี้:

วิธี คำอธิบาย
int getYear()
ส่งกลับปีของวันที่ที่ระบุ
Month getMonth()
ส่งกลับวันที่ของเดือน: หนึ่งในหลายค่าคงที่
JANUARY, FEBRUARY, ...;
int getMonthValue()
ส่งกลับดัชนีของเดือนวันที่ มกราคม == 1.
int getDayOfMonth()
ส่งกลับดัชนีของวันของเดือน
int getDayOfYear()
ส่งกลับดัชนีของวันตั้งแต่ต้นปี
DayOfWeek getDayOfWeek()
ส่งกลับวันในสัปดาห์: หนึ่งในค่าคงที่หลายๆ ค่า
MONDAY, TUESDAY, ...;
IsoEra getEra()
ส่งกลับยุค: อย่างใดอย่างหนึ่งBCE(ก่อนยุคปัจจุบัน) และCE(ยุคปัจจุบัน)

ตัวอย่าง:

รหัส เอาต์พุตคอนโซล
LocalDate today = LocalDate.now();
System.out.println(today.getYear());
System.out.println(today.getMonth());
System.out.println(today.getMonthValue());
System.out.println(today.getDayOfMonth());
System.out.println(today.getDayOfWeek());

2019
FEBRUARY
2
22
FRIDAY

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

ชั้นLocalDateเรียนประกอบด้วยวิธีการต่างๆ มากมายที่ช่วยให้คุณทำงานกับวันที่ได้ การนำเมธอดเหล่านี้ไปปฏิบัตินั้นคล้ายคลึงกับเมธอดของStringคลาส: พวกมันจะไม่เปลี่ยนLocalDateวัตถุที่มีอยู่ แต่จะส่งคืนอันใหม่พร้อมข้อมูลที่ต้องการแทน

นี่คือวิธีการของLocalDateชั้นเรียน:

วิธี คำอธิบาย
plusDays(int days)
เพิ่มจำนวนวันที่ระบุในวันที่
plusWeeks(int weeks)
เพิ่มสัปดาห์ในวันที่
plusMonths(int months)
เพิ่มเดือนในวันที่
plusYears(int years)
เพิ่มปีในวันที่
minusDays(int days)
ลบวันออกจากวันที่
minusWeeks(int weeks)
ลบสัปดาห์จากวันที่
minusMonths(int months)
ลบเดือนจากวันที่
minusYears(int years)
ลบปีจากวันที่

ตัวอย่าง:

รหัส เอาต์พุตคอนโซล
LocalDate birthday = LocalDate.of(2019, 2, 28);
LocalDate nextBirthday = birthday.plusYears(1);
LocalDate firstBirthday = birthday.minusYears(30);

System.out.println(birthday);
System.out.println(nextBirthday);
System.out.println(firstBirthday);




2019-02-28
2020-02-28
1989-02-28

วิธีbirthday objectการที่เราเรียกไม่เปลี่ยนแปลง เมธอดจะส่งคืนวัตถุใหม่ที่มีข้อมูลที่ต้องการแทน