TL; DR
Instant.now() // Capture the current moment in UTC.
สร้าง String เพื่อแทนค่านั้น:
Instant.now().toString()
2016-09-13T23: 30: 52.123Z
รายละเอียด
ในฐานะที่เป็นคำตอบที่ถูกต้องโดยจอนสกีตกล่าวว่าวัตถุ java.util.Date มีโซนเวลา † แต่toString
การนำไปใช้นั้นจะใช้เขตเวลาเริ่มต้นของ JVM เมื่อสร้างการแทนค่าสตริงของค่าวันที่และเวลา วันที่สับสนกับโปรแกรมเมอร์ไร้เดียงสา Date ดูเหมือนจะมีเขตเวลา แต่ไม่มี
The java.util.Date
, j.u.Calendar
และjava.text.SimpleDateFormat
คลาสที่รวมกับ Java นั้นมีปัญหาอย่างมาก หลีกเลี่ยงพวกเขา ใช้ไลบรารีวันที่และเวลาที่มีความสามารถเหล่านี้แทน
java.time (Java 8)
Java 8นำเสนอแพ็คเกจ java.time. *ใหม่ที่ยอดเยี่ยมเพื่อแทนที่คลาส java.util.Date/Calendar เก่า
รับเวลาปัจจุบันใน UTC / GMT เป็นหนึ่งซับ ...
Instant instant = Instant.now();
ว่าInstant
ชั้นเป็นอาคารบล็อกพื้นฐานใน java.time คิดเป็นช่วงเวลาบนไทม์ไลน์ในส่วนUTCมีความละเอียดของนาโนวินาที
ใน Java 8 เวลาปัจจุบันจะถูกจับด้วยความละเอียดสูงสุดมิลลิวินาทีเท่านั้น Java 9 นำการใช้งานใหม่ของการClock
จับภาพช่วงเวลาปัจจุบันไปจนถึงความสามารถระดับนาโนวินาทีแบบเต็มของคลาสนี้ขึ้นอยู่กับความสามารถของฮาร์ดแวร์นาฬิกาในคอมพิวเตอร์โฮสต์ของคุณ
toString
เมธอดIt's สร้างการแทนค่าสตริงโดยใช้รูปแบบ ISO 8601 เฉพาะรูปแบบเดียว รูปแบบนั้นจะแสดงผลลัพธ์เป็นศูนย์, สาม, หกหรือเก้าหลัก ( มิลลิวินาที , ไมโครวินาทีหรือนาโนวินาที ) ตามความจำเป็นเพื่อแสดงเศษส่วนของวินาที
หากคุณต้องการการจัดรูปแบบที่มีความยืดหยุ่นมากขึ้นหรือคุณสมบัติเพิ่มเติมอื่น ๆ แล้วใช้การ UTC ชดเชยจากศูนย์สำหรับ UTC ตัวเอง ( ZoneOffset.UTC
คงที่ ) OffsetDateTime
เพื่อให้ได้
OffsetDateTime now = OffsetDateTime.now( ZoneOffset.UTC );
ถ่ายโอนข้อมูลไปยังคอนโซล ...
System.out.println( "now.toString(): " + now );
เมื่อวิ่ง ...
now.toString(): 2014-01-21T23:42:03.522Z
เกี่ยวกับjava.time
java.timeกรอบถูกสร้างขึ้นใน Java 8 และต่อมา ชั้นเรียนเหล่านี้แย่งลำบากเก่ามรดกเรียนวันที่เวลาเช่นjava.util.Date
, และCalendar
SimpleDateFormat
ต้องการเรียนรู้เพิ่มเติมโปรดดูที่ออราเคิลกวดวิชา และค้นหา Stack Overflow สำหรับตัวอย่างและคำอธิบายมากมาย สเปกJSR 310
Joda เวลาโครงการขณะนี้อยู่ในโหมดการบำรุงรักษาให้คำแนะนำแก่การโยกย้ายไปยังjava.timeชั้นเรียน
คุณสามารถแลกเปลี่ยนวัตถุjava.timeโดยตรงกับฐานข้อมูลของคุณ ใช้ไดรเวอร์ JDBC ที่สอดคล้องกับJDBC 4.2หรือใหม่กว่า ไม่จำเป็นต้องใช้สตริงไม่จำเป็นต้องมีjava.sql.*
คลาส
จะรับคลาส java.time ได้ที่ไหน?
โครงการThreeTen-Extraขยาย java.time ด้วยคลาสเพิ่มเติม โครงการนี้เป็นพื้นฐานที่พิสูจน์ได้สำหรับการเพิ่มเติมในอนาคตไปยัง java.time คุณอาจพบว่าการเรียนที่มีประโยชน์บางอย่างที่นี่เช่นInterval
, YearWeek
, YearQuarter
และอื่น ๆ อีกมากมาย
Joda เวลา
UPDATE: โครงการJoda-Timeในขณะนี้อยู่ในโหมดบำรุงรักษาแนะนำการโยกย้ายไปยังคลาสjava.time
การใช้ไลบรารีโอเพนซอร์สฟรีของต้นทุนJoda-Timeของบุคคลที่สามคุณสามารถรับวันที่ปัจจุบันได้ด้วยรหัสเพียงบรรทัดเดียว
Joda-Time สร้างคลาส java.time. * ใหม่ใน Java 8 แต่มีสถาปัตยกรรมที่แตกต่างกัน คุณสามารถใช้ Joda-Time กับ Java เวอร์ชันเก่าได้ Joda-Time ยังคงทำงานใน Java 8 และยังคงได้รับการบำรุงรักษาอย่างต่อเนื่อง (จนถึงปี 2014) อย่างไรก็ตามทีม Joda-Time ไม่แนะนำให้โยกย้ายไปยัง java.time
System.out.println( "UTC/GMT date-time in ISO 8601 format: " + new org.joda.time.DateTime( org.joda.time.DateTimeZone.UTC ) );
โค้ดตัวอย่างที่มีรายละเอียดเพิ่มเติม (Joda-Time 2.3) ...
org.joda.time.DateTime now = new org.joda.time.DateTime(); // Default time zone.
org.joda.time.DateTime zulu = now.toDateTime( org.joda.time.DateTimeZone.UTC );
ถ่ายโอนข้อมูลไปยังคอนโซล ...
System.out.println( "Local time in ISO 8601 format: " + now );
System.out.println( "Same moment in UTC (Zulu): " + zulu );
เมื่อวิ่ง ...
Local time in ISO 8601 format: 2014-01-21T15:34:29.933-08:00
Same moment in UTC (Zulu): 2014-01-21T23:34:29.933Z
สำหรับรหัสตัวอย่างเพิ่มเติมที่ใช้ในเขตเวลาทำงานให้ดูคำตอบของคำถามที่คล้ายกัน
เขตเวลา
ฉันขอแนะนำให้คุณระบุเขตเวลาเสมอแทนที่จะพึ่งพาปริยายในเขตเวลาเริ่มต้นปัจจุบันของ JVM (ซึ่งสามารถเปลี่ยนแปลงได้ตลอดเวลา!) การพึ่งพาเช่นนี้ดูเหมือนจะเป็นสาเหตุของความสับสนและข้อบกพร่องในงานวันเวลา
เมื่อโทรnow()
ผ่านเขตเวลาที่ต้องการ / ที่คาดไว้ ใช้DateTimeZone
คลาส
DateTimeZone zoneMontréal = DateTimeZone.forID( "America/Montreal" );
DateTime now = DateTime.now( zoneMontréal );
คลาสนั้นมีค่าคงที่สำหรับเขตเวลาUTC
DateTime now = DateTime.now( DateTimeZone.UTC );
หากคุณต้องการใช้เขตเวลาเริ่มต้นปัจจุบันของ JVM อย่างแท้จริงให้โทรออกอย่างชัดเจนเพื่อให้รหัสของคุณเป็นเอกสารด้วยตนเอง
DateTimeZone zoneDefault = DateTimeZone.getDefault();
ISO 8601
อ่านเกี่ยวกับรูปแบบISO 8601 ทั้ง java.time และ Joda-Time ใช้รูปแบบที่สมเหตุสมผลของมาตรฐานนั้นเป็นค่าเริ่มต้นสำหรับทั้งการแยกวิเคราะห์และการสร้างสตริง
†จริง java.util.Date จะมีโซนเวลาที่ฝังอยู่ลึกลงไปใต้ชั้นของรหัสที่มา สำหรับจุดประสงค์เชิงปฏิบัติส่วนใหญ่เขตเวลานั้นจะถูกข้ามไป ดังนั้นตามชวเลขเราบอกว่า java.util.Date ไม่มีเขตเวลา นอกจากนี้เขตเวลาที่ฝังไม่ได้ใช้โดยtoString
วิธีของวันที่ วิธีการนั้นใช้เขตเวลาเริ่มต้นปัจจุบันของ JVM เหตุผลเพิ่มเติมทั้งหมดเพื่อหลีกเลี่ยงคลาสที่สับสนและใช้ Joda-Time และ java.time