1. ZonedDateTimeชั้นเรียน

มีอีกคลาสที่น่าสนใจมากใน Date Time API: ZonedDateTimeคลาส จุดประสงค์หลักคือการทำให้สะดวกในการทำงานกับวันที่ในเขตเวลาต่างๆ

LocalDateเหมาะสำหรับการแสดงวันที่ ตัวอย่างเช่นวันเกิด วันเกิดของฉันคือวันที่ 15 มีนาคม ไม่ว่าฉันจะอยู่ที่ไหน นี่คือตัวอย่างวันที่

LocalTimeอธิบายเวลาได้ดีมาก เหมือนเวลาที่ตั้งไว้บนนาฬิกาปลุก ฉันตั้งนาฬิกาปลุกไว้ตอนตี 5 ไม่สำคัญว่าฉันจะอยู่ที่ไหน 05.00 น. คือ 05.00 น. นี่คือตัวอย่างของการทำงานกับเวลา

สมมติว่าเรากำลังเขียนใบสมัครเพื่อจองเที่ยวบิน เครื่องบินขึ้นและลงตามเวลาท้องถิ่น เครื่องบินอยู่ในอากาศตามเวลาที่กำหนด แต่เขตเวลาสามารถเปลี่ยนแปลงได้

โซนเวลา

อย่างไรก็ตาม เขตเวลานั้นยุ่งเหยิงจริงๆ และถ้าคุณคิดว่ามี 24 โซนเวลา คุณคิดผิดอย่างมาก

ตัวอย่างเช่น เวลาในอินเดียแตกต่างจากเวลามาตรฐานกรีนิช 5 ชั่วโมงครึ่งGMT+5:30: บางประเทศเปลี่ยนเป็นเวลาออมแสง และบางประเทศไม่เปลี่ยน ยิ่งไปกว่านั้น ประเทศต่างๆ จะเปลี่ยนไปใช้ฤดูร้อนในช่วงเวลาต่างๆ ของปี

และบางประเทศผ่านกฎหมายที่ยกเลิกการปรับเวลาตามฤดูกาล หรือนำกลับมาใช้ใหม่ หรือยกเลิกอีกครั้ง

ไม่ว่าในกรณีใดก็ตาม โลกมีโซนเวลา และภายในแต่ละโซนเวลาจะมีเวลาเดียว เวลาในโซนต่างๆ อาจตรงกันในบางช่วงของปี และแตกต่างกันในช่วงอื่นๆ โซนเวลามักจะตั้งชื่อตามเมืองใหญ่ที่ตั้งอยู่ในเขตเหล่านั้น: Europe/Monaco, Asia/Singapore, แต่ก็มีข้อยกเว้นเช่นกันUS/Pacific

อย่างเป็นทางการ ขณะนี้มี 599 โซนเวลา ลองคิดดู: 599 นั่นยังห่างไกลจาก 24 ยินดีต้อนรับสู่โลกสากล

คลาสZoneIdจากjava.timeแพ็คเกจใช้เพื่อจัดเก็บเขตเวลาใน Java

อย่างไรก็ตาม มันมีgetAvailableZoneIds()เมธอดแบบสแตติกซึ่งจะส่งคืนชุดของโซนเวลาที่รู้จักทั้งหมดในปัจจุบัน หากต้องการดูรายการโซนทั้งหมด คุณต้องเขียนโค้ดต่อไปนี้:

รหัส เอาต์พุตคอนโซล (บางส่วน)
for (String s: ZoneId.getAvailableZoneIds())
   System.out.println(s);
Asia/Aden
America/Cuiaba
Etc/GMT+9
Etc/GMT+8

ในการรับZoneIdวัตถุตามชื่อ คุณต้องใช้of()เมธอดแบบ สแตติก

รหัส บันทึก
ZoneId zone = ZoneId.of("Africa/Cairo");
Cairo


2. การสร้างZonedDateTimeวัตถุ

เมื่อสร้างZonedDateTimeวัตถุ คุณต้องเรียกใช้now()เมธอดสแตติกของคลาสและส่งZoneIdวัตถุไปให้

รหัส เอาต์พุตคอนโซล
ZoneId zone = ZoneId.of("Africa/Cairo");
ZonedDateTime time = ZonedDateTime.now(zone);
System.out.println(time);


2019-02-22T11:37:58.074816+02:00[Africa/Cairo]

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

ตัวอย่าง:

รหัส เอาต์พุตคอนโซล
ZonedDateTime time = ZonedDateTime.now();
System.out.println(time);

2019-02-22T13:39:05.70842+02:00[Europe/Helsinki]

การแปลงวันที่สากลเป็นวันที่ท้องถิ่น

หนึ่งในคุณสมบัติที่น่าสนใจZonedDateTimeคือความสามารถในการแปลงเป็นวันที่และเวลาท้องถิ่น ตัวอย่าง:

ZoneId zone = ZoneId.of("Africa/Cairo");
ZonedDateTime cairoTime = ZonedDateTime.now(zone);

LocalDate localDate = cairoTime.toLocalDate();
LocalTime localTime = cairoTime.toLocalTime();
LocalDateTime localDateTime = cairoTime.toLocalDateTime();

3. ทำงานตามเวลา

เช่นเดียวกับLocalDateTimeชั้นเรียน ชั้นZonedDateTimeเรียนมีหลายวิธีในการรับองค์ประกอบแต่ละส่วนของวันที่และเวลา นี่คือรายการของวิธีการเหล่านี้:

int getYear()
ส่งกลับปีของวันที่ที่ระบุ
Month getMonth()
ส่งกลับวันที่ของเดือน: หนึ่งในหลาย ๆ ค่าคงที่ —JANUARY, FEBRUARY, ...;
int getMonthValue()
ส่งกลับดัชนีของเดือนวันที่ มกราคม == 1
int getDayOfMonth()
ส่งกลับดัชนีของวันของเดือน
DayOfWeek getDayOfWeek()
ส่งกลับวันในสัปดาห์: หนึ่งในหลาย ๆ ค่าคงที่ —MONDAY, TUESDAY, ...;
int getDayOfYear()
ส่งกลับดัชนีของวันในปี
int getHour()
ส่งกลับชั่วโมง
int getMinute()
ส่งกลับนาที
int getSecond()
คืนค่าวินาที
int getNano()
คืนค่านาโนวินาที

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

วิธีการ คำอธิบาย
plusYears(int)
เพิ่มปีในวันที่
plusMonths(int)
เพิ่มเดือนในวันที่
plusDays(int)
เพิ่มวันในวันที่
plusHours(int)
เพิ่มชั่วโมง
plusMinutes(int)
เพิ่มนาที
plusSeconds(int)
เพิ่มวินาที
plusNanos(int)
เพิ่มนาโนวินาที
minusYears(int)
ลบปีจากวันที่
minusMonths(int)
ลบเดือนจากวันที่
minusDays(int)
ลบวันออกจากวันที่
minusHours(int)
ลบชั่วโมง
minusMinutes(int)
ลบนาที
minusSeconds(int)
ลบวินาที
minusNanos(int)
ลบนาโนวินาที

เราจะไม่ยกตัวอย่างใดๆ เนื่องจากเราคิดว่าทุกอย่างชัดเจนโดยเปรียบเทียบกับชั้นเรียนที่เราเพิ่งพิจารณา