ในที่สุดJavaก็มีวิธีที่ใช้งานง่ายและเชื่อถือได้ในการทำงานกับวันที่และเวลา หลักการของวันที่และเวลาเป็นพื้นฐานในการใช้งานหลายอย่าง สิ่งต่างๆ เช่น วันเกิด วันที่เช่า เวลากิจกรรม และเวลาเปิดทำการของร้านค้า ล้วนขึ้นอยู่กับวันที่และเวลา แต่Java SEไม่มีวิธีที่สะดวกในการทำงานกับสิ่งเหล่านั้น เริ่มต้นด้วยJava SE 8 มีชุด แพ็คเกจjava.timeซึ่งมีAPI ที่มีโครงสร้างดี สำหรับการทำงานกับวันที่และเวลา
ต่อไปนี้คือรายการปัญหาเล็กๆ น้อยๆ ที่มีอยู่ในการใช้งาน:
พื้นหลัง
เมื่อJavaเปิดตัวครั้งแรก ในเวอร์ชัน1.0คลาสเดียวสำหรับการทำงานกับวันที่และเวลาคือjava.util.Date สิ่งแรกที่นักพัฒนาสังเกตเห็นคือมันไม่ได้แสดงถึง "วันที่" ในความเป็นจริง มันแสดงถึงช่วงเวลาหนึ่งซึ่งมีความแม่นยำถึงมิลลิวินาที วัดจากวันที่ 1 มกราคม 1970 อย่างไรก็ตาม จากข้อเท็จจริงที่ว่า เมธอด toString()ของDateแสดงวันที่และเวลาในเขตเวลาที่ระบุใน การตั้งค่า java ของเครื่อง นักพัฒนาบางรายจึงสรุปอย่างผิดพลาดว่าDateสามารถทำงานกับเขตเวลาได้ การแก้ไขคลาสนี้กลายเป็นเรื่องยาก (หรือขี้เกียจมาก) ซึ่งในเวอร์ชัน1.1เราต้องเพิ่มคลาสใหม่- java.util.Calendar น่าเสียดายที่ คลาส Calendarกลับกลายเป็นว่าไม่ได้ดีไปกว่าDate มาก นัก- เปลี่ยนแปลงได้ คลาสเช่นวันที่และเวลาควรไม่เปลี่ยนรูป
- ออฟเซ็ต ปีในวันที่เริ่มต้นจาก 1900 เดือนในทั้งสองชั้นเรียนเริ่มต้นจากศูนย์
- ชื่อ. วันที่ไม่ใช่ "วันที่" จริงๆ และปฏิทินไม่ใช่ปฏิทิน
- การจัดรูปแบบ การจัดรูปแบบใช้ได้กับวันที่เท่านั้น ไม่ใช่ปฏิทิน และไม่ปลอดภัยสำหรับเธรด
ทบทวน
java.time API ใหม่ประกอบด้วย 5 แพ็คเกจ:- java.time - แพ็คเกจพื้นฐานที่มีอ็อบเจ็กต์เพื่อเก็บค่า
- java.time.chrono - ให้การเข้าถึงปฏิทินต่างๆ
- java.time.format - การจัดรูปแบบและการจดจำวันที่และเวลา
- java.time.temporal - ไลบรารีระดับต่ำและฟังก์ชันขั้นสูง
- java.time.zone - คลาสสำหรับการทำงานกับเขตเวลา
วันที่
คลาส LocalDateเป็นหนึ่งในคลาสที่สำคัญที่สุดใน APIใหม่ ประกอบด้วยค่าที่ไม่เปลี่ยนรูปซึ่งแสดงถึงวันที่ คุณไม่สามารถตั้งเวลาหรือโซนเวลาได้ ชื่อ "local" อาจคุ้นเคยกับคุณจาก Joda-Timeและมาจาก มาตรฐาน ISO - 8601 มันหมายถึงการไม่มีเขตเวลาอย่างแม่นยำ โดยพื้นฐานแล้ว LocalDateคือคำอธิบายของวันที่ เช่น "5 เมษายน 2014" เวลาจริงของวันที่นี้จะแตกต่างกันไปขึ้นอยู่กับเขตเวลาของคุณ ตัวอย่างเช่น ในออสเตรเลีย วันที่นี้จะเร็วกว่าในลอนดอน 10 ชั่วโมง และเร็วกว่าในซานฟรานซิสโก 18 ชั่วโมง คลาส LocalDateมีวิธีการที่จำเป็นโดยทั่วไปทั้งหมด:LocalDate date = LocalDate.of(2014, Month.JUNE, 10); int year = date.getYear(); // 2014 Month month = date.getMonth(); // Июнь int dom = date.getDayOfMonth(); // 10 DayOfWeek dow = date.getDayOfWeek(); // Вторник int len = date.lengthOfMonth(); // 30 (дней в Июне) boolean leap = date.isLeapYear(); // false (не високосный год)
ในตัวอย่างของเรา เราจะเห็นวันที่ที่สร้างขึ้นโดยใช้วิธีการของโรงงาน (ตัวสร้างทั้งหมดเป็นแบบส่วนตัว) ต่อไปเราจะขอข้อมูลบางอย่างจากวัตถุ โปรดทราบว่า การแจง
นับเดือนและ
วันสัปดาห์ได้รับการออกแบบมาเพื่อให้โค้ดสามารถอ่านและเชื่อถือได้มากขึ้น ในตัวอย่างต่อไปนี้ เราจะดูวิธีแก้ไขวันที่ เนื่องจากคลาสไม่เปลี่ยนรูป ผลลัพธ์จะเป็นอ็อบเจ็กต์ใหม่ แต่คลาสดั้งเดิมจะยังคงเหมือนเดิม
LocalDate date = LocalDate.of(2014, Month.JUNE, 10); date = date.withYear(2015); // 2015-06-10 date = date.plusMonths(2); // 2015-08-10 date = date.minusDays(1); // 2015-08-09
สิ่งเหล่านี้เป็นการเปลี่ยนแปลงที่ค่อนข้างง่าย แต่บ่อยครั้งที่คุณต้องทำการแก้ไขวันที่ที่ซับซ้อนมากขึ้น มีกลไกพิเศษสำหรับสิ่งนี้ใน
java.time API - TemporalAdjuster วัตถุประสงค์คือเพื่อให้มีเครื่องมือในตัวที่ช่วยให้คุณสามารถจัดการวันที่ได้ เช่น การรับวัตถุที่ตรงกับวันสุดท้ายของเดือน บางส่วนรวมอยู่ใน
APIแต่คุณสามารถเพิ่มของคุณเองได้ การใช้ตัวแก้ไขนั้นง่ายมาก แต่ต้องมีการนำเข้าแบบคงที่:
import static java.time.DayOfWeek.* import static java.time.temporal.TemporalAdjusters.* LocalDate date = LocalDate.of(2014, Month.JUNE, 10); date = date.with(lastDayOfMonth()); date = date.with(nextOrSame(WEDNESDAY));
การใช้ตัวแก้ไขจะทำให้โค้ดของคุณง่ายขึ้นอย่างมาก ไม่มีใครอยากเห็นการจัดการวันที่ด้วยตนเองมากนัก หากการบิดเบือนวันที่เกิดขึ้นหลายครั้งในโปรเจ็กต์ของคุณ ให้เขียนตัวแก้ไขของคุณเอง จากนั้นทีมของคุณจะสามารถใช้เป็นองค์ประกอบที่เขียนและทดสอบแล้วได้
GO TO FULL VERSION