tl; dr
LocalDate.of( 2014 , 2 , 11 )
หากคุณยืนยันที่จะใช้java.util.Date
คลาสเก่าที่น่ากลัวให้แปลงจากคลาสjava.time ที่ทันสมัย
java.util.Date
.from(
LocalDate
.of( 2014 , 2 , 11 )
.atStartOfDay(
ZoneId.of( "Africa/Tunis" )
)
.toInstant()
)
รายละเอียด
หากคุณต้องการ "ง่าย" คุณควรใช้แพ็คเกจ java.timeใหม่ใน Java 8 แทนที่จะเป็นคลาส java.util.Date & .Calendar ที่มีปัญหาฉาวโฉ่ที่มาพร้อมกับ Java
java.time
java.timeกรอบที่สร้างขึ้นใน Java 8 และต่อมา supplants ลำบากเรียน java.util.Date/.Calendar เก่า
วันที่เท่านั้น
LocalDate
ชั้นถูกนำเสนอโดย java.time เพื่อแสดงค่าวันเท่านั้นโดยไม่ต้องมีช่วงเวลาของวันหรือเขตเวลา คุณต้องมีเขตเวลาเพื่อกำหนดวันที่เนื่องจากวันใหม่เริ่มต้นในปารีสเร็วกว่าในมอนทรีออล ZoneId
ระดับสำหรับโซนเวลา
ZoneId zoneId = ZoneId.of( "Asia/Singapore" );
LocalDate today = LocalDate.now( zoneId );
ถ่ายโอนไปยังคอนโซล:
System.out.println ( "today: " + today + " in zone: " + zoneId );
วันนี้: 2015-11-26 ในโซน: เอเชีย / สิงคโปร์
หรือใช้วิธีโรงงานระบุปีเดือนวัน.
LocalDate localDate = LocalDate.of( 2014 , Month.FEBRUARY , 11 );
localDate: 2014-02-11
หรือผ่านเดือนที่ 1-12 แทนที่จะเป็นDayOfWeek
วัตถุ enum
LocalDate localDate = LocalDate.of( 2014 , 2 , 11 );
เขตเวลา
A LocalDate
ไม่มีความหมายที่แท้จริงจนกว่าคุณจะปรับเป็นเขตเวลา ใน java.time เราใช้เขตเวลาเพื่อสร้างZonedDateTime
วัตถุ นั่นหมายถึงช่วงเวลาของวันด้วย แต่กี่โมง? มักจะเหมาะสมกับช่วงเวลาแรกของวัน คุณอาจคิดว่านั่นหมายถึงเวลา00:00:00.000
แต่ไม่จริงเสมอไปเพราะเวลาออมแสง (DST) และความผิดปกติอื่น ๆ แทนที่จะสมมติว่าเวลาที่เราถาม java.time atStartOfDay
ในการกำหนดช่วงเวลาที่แรกของวันโดยการเรียก
ระบุชื่อโซนเวลาที่เหมาะสมในรูปแบบของcontinent/region
เช่นAmerica/Montreal
, หรือAfrica/Casablanca
Pacific/Auckland
อย่าใช้อักษรย่อ 3-4 ตัวเช่นEST
หรือIST
เนื่องจากไม่ใช่เขตเวลาจริงไม่เป็นมาตรฐานและไม่ซ้ำกัน (!)
ZoneId zoneId = ZoneId.of( "Asia/Singapore" );
ZonedDateTime zdt = localDate.atStartOfDay( zoneId );
zdt: 2014-02-11T00: 00 + 08: 00 [เอเชีย / สิงคโปร์]
UTC
สำหรับงานส่วนหลัง (ตรรกะทางธุรกิจฐานข้อมูลการจัดเก็บข้อมูลและการแลกเปลี่ยน) เรามักใช้เขตเวลาUTC ใน java.time Instant
คลาสจะแสดงช่วงเวลาบนไทม์ไลน์ใน UTC วัตถุทันทีสามารถสกัดได้จาก ZonedDateTime toInstant
โดยการเรียก
Instant instant = zdt.toInstant();
ทันที: 2014-02-10T16: 00: 00Z
แปลง
คุณควรหลีกเลี่ยงการใช้java.util.Date
คลาสโดยสิ้นเชิง แต่ถ้าคุณต้องทำงานร่วมกับโค้ดเก่าที่ยังไม่ได้อัปเดตสำหรับjava.timeคุณสามารถแปลงกลับไปกลับมาได้ มองหาวิธีการแปลงใหม่ที่เพิ่มเข้ามาในคลาสเก่า
java.util.Date d = java.util.from( instant ) ;
…และ…
Instant instant = d.toInstant() ;
เกี่ยวกับjava.time
java.timeกรอบถูกสร้างขึ้นใน Java 8 และต่อมา ชั้นเรียนเหล่านี้แย่งลำบากเก่ามรดกเรียนวันที่เวลาเช่นjava.util.Date
, และCalendar
SimpleDateFormat
ต้องการเรียนรู้เพิ่มเติมโปรดดูที่ออราเคิลกวดวิชา และค้นหา Stack Overflow สำหรับตัวอย่างและคำอธิบายมากมาย สเปกJSR 310
โครงการJoda-Timeขณะนี้อยู่ในโหมดการบำรุงรักษาแนะนำให้ย้ายไปที่คลาสjava.time
คุณสามารถแลกเปลี่ยนวัตถุjava.timeโดยตรงกับฐานข้อมูลของคุณ ใช้ไดรเวอร์ JDBC ที่สอดคล้องกับJDBC 4.2หรือใหม่กว่า ไม่ต้องมีสตริงไม่ต้องมีjava.sql.*
คลาส Hibernate 5 & JPA 2.2 สนับสนุนjava.time
จะหาคลาส java.time ได้ที่ไหน?
อัปเดต: ขณะนี้ไลบรารีJoda-Timeอยู่ในโหมดการบำรุงรักษาและแนะนำการย้ายข้อมูลไปยังคลาสjava.time ฉันจะออกจากส่วนนี้สำหรับประวัติศาสตร์
Joda-Time
สำหรับสิ่งหนึ่งที่ Joda เวลาใช้เลขที่เหมาะสมเพื่อกุมภาพันธ์เป็นไม่ได้2
1
อีกประการหนึ่ง Joda-Time DateTime รู้เขตเวลาที่กำหนดอย่างแท้จริงซึ่งแตกต่างจาก java.util.Date ซึ่งดูเหมือนจะมีเขตเวลา แต่ไม่มี
และอย่าลืมเขตเวลา มิฉะนั้นคุณจะได้รับค่าเริ่มต้นของ JVM
DateTimeZone timeZone = DateTimeZone.forID( "Asia/Singapore" );
DateTime dateTimeSingapore = new DateTime( 2014, 2, 11, 0, 0, timeZone );
DateTime dateTimeUtc = dateTimeSingapore.withZone( DateTimeZone.UTC );
java.util.Locale locale = new java.util.Locale( "ms", "SG" );
String output = DateTimeFormat.forStyle( "FF" ).withLocale( locale ).print( dateTimeSingapore );
ทิ้งไปที่คอนโซล ...
System.out.println( "dateTimeSingapore: " + dateTimeSingapore );
System.out.println( "dateTimeUtc: " + dateTimeUtc );
System.out.println( "output: " + output );
เมื่อเรียกใช้ ...
dateTimeSingapore: 2014-02-11T00:00:00.000+08:00
dateTimeUtc: 2014-02-10T16:00:00.000Z
output: Selasa, 2014 Februari 11 00:00:00 SGT
การแปลง
หากคุณต้องการแปลงเป็น java.util.Date เพื่อใช้กับคลาสอื่น ๆ ...
java.util.Date date = dateTimeSingapore.toDate();