ฉันมีปัญหากับคลาส Date ใน Java คลาสวันที่ส่งคืนวันที่เครื่องในเครื่อง แต่ฉันต้องการ UTC-0
ฉัน googled และพบวิธีแก้ปัญหาที่ยอดเยี่ยมสำหรับ JavaScript แต่สำหรับ Java ไม่มีประโยชน์อะไร
วิธีรับ UTC + 0 date ใน Java 8
ฉันมีปัญหากับคลาส Date ใน Java คลาสวันที่ส่งคืนวันที่เครื่องในเครื่อง แต่ฉันต้องการ UTC-0
ฉัน googled และพบวิธีแก้ปัญหาที่ยอดเยี่ยมสำหรับ JavaScript แต่สำหรับ Java ไม่มีประโยชน์อะไร
วิธีรับ UTC + 0 date ใน Java 8
คำตอบ:
ด้วย Java 8 คุณสามารถเขียน:
OffsetDateTime utc = OffsetDateTime.now(ZoneOffset.UTC);
ในการตอบความคิดเห็นของคุณคุณสามารถแปลงเป็นวันที่ (เว้นแต่คุณจะขึ้นอยู่กับรหัสเดิมฉันไม่เห็นเหตุผลใด ๆ ) หรือเป็นมิลลิวินาทีตั้งแต่ยุค:
Date date = Date.from(utc.toInstant());
long epochMillis = utc.toInstant().toEpochMilli();
OffsetDateTime
มากกว่าที่จะZonedDateTime
ระบุว่าเรากำลังทำงานกับเพียงออฟเซ็ตจาก UTC แทนที่จะเป็นเขตเวลาเต็ม
utc.toInstant().toEpochMilli()
เป็นการแปลงเป็นมิลลิวินาทีที่แม่นยำกว่านี้หรือ?
Instant.now()
คลาสวันเวลาเก่าที่มีปัญหาซึ่งมาพร้อมกับ Java เวอร์ชันแรกสุดถูกแทนที่ด้วยคลาสjava.time ที่สร้างไว้ใน Java 8 และใหม่กว่า ดูออราเคิลกวดวิชา มากของการทำงานที่ได้รับกลับรังเพลิง Java 6 และ 7 ในThreeTen-ย้ายกลับไปและต่อไปปรับใช้กับ Android ในThreeTenABP
Instant
Instant
หมายถึงช่วงเวลาบนไทม์ไลน์ในส่วนUTCที่มีความละเอียดถึงนาโนวินาที
Instant instant = Instant.now();
toString
วิธีการสร้างวัตถุสตริงที่มีข้อความที่เป็นตัวแทนของค่าวันเวลาโดยใช้หนึ่งในมาตรฐานISO 8601รูปแบบ
String output = instant.toString();
2016-06-27T19: 15: 25.864Z
Instant
ชั้นเป็นชั้นอาคารบล็อกพื้นฐานใน java.time นี่ควรเป็นชั้นเรียนของคุณเมื่อจัดการกับวันที่ - เวลาโดยทั่วไปแนวทางปฏิบัติที่ดีที่สุดคือการติดตามจัดเก็บและแลกเปลี่ยนค่าวันที่ - เวลาใน UTC
OffsetDateTime
แต่Instant
มีข้อ จำกัด เช่นไม่มีตัวเลือกการจัดรูปแบบสำหรับการสร้างสตริงในรูปแบบอื่น สำหรับความยืดหยุ่นมากขึ้นแปลงจากไปInstant
OffsetDateTime
ระบุชดเชยจาก UTC ใน java.time นั่นหมายถึงZoneOffset
วัตถุ ที่นี่เราต้องการติดกับ UTC (00) ZoneOffset.UTC
เพื่อให้เราสามารถใช้อย่างต่อเนื่องสะดวก
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );
2016-06-27T19: 15: 25.864Z
หรือข้ามInstant
ชั้นเรียน.
OffsetDateTime.now( ZoneOffset.UTC )
ขณะนี้มีOffsetDateTime
วัตถุอยู่ในมือคุณสามารถใช้DateTimeFormatter
สร้างวัตถุ String พร้อมข้อความในรูปแบบอื่นได้ ค้นหา Stack DateTimeFormatter
มากเกินหลายตัวอย่างของการใช้
ZonedDateTime
เมื่อคุณต้องการที่จะแสดงเวลาผนังนาฬิกาสำหรับโซนเวลาบางอย่างโดยเฉพาะอย่างยิ่งใช้จะได้รับZoneId
ZonedDateTime
ในตัวอย่างนี้เราใช้เขตเวลามอนทรีออล ในช่วงฤดูร้อนภายใต้การปรับเวลาตามฤดูกาล (DST)-04:00
เรื่องไร้สาระโซนได้ชดเชย ดังนั้นสังเกตว่าเวลาของวันเร็วกว่าสี่ชั่วโมงในผลลัพธ์อย่างไร15
แทนที่จะเป็น19
ชั่วโมง Instant
และZonedDateTime
ทั้งสองแสดงถึงช่วงเวลาที่เกิดขึ้นพร้อมกันเพียงแค่มองผ่านเลนส์สองตัวที่แตกต่างกัน
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );
2016-06-27T15: 15: 25.864-04: 00 [อเมริกา / มอนทรีออล]
แม้ว่าคุณควรหลีกเลี่ยงคลาสวันเวลาแบบเก่า แต่คุณต้องสามารถแปลงโดยใช้วิธีการใหม่ที่เพิ่มเข้ามาในคลาสเก่าได้ ที่นี่เราใช้java.util.Date.from( Instant )
และjava.util.Date::toInstant
.
java.util.Date utilDate = java.util.Date.from( instant );
และไปทางอื่น
Instant instant= utilDate.toInstant();
ในทำนองเดียวกันการมองหาวิธีการใหม่ที่เพิ่มGregorianCalendar
(subclass ของCalendar
) java.time.ZonedDateTime
เพื่อแปลงไปและกลับจาก
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 ได้ที่ไหน?
ZonedDateTime
จำเป็นเพราะทั้งหมดZoneId
จะจับคู่กับสิ่งที่ZoneOffset
เราสามารถใช้ได้OffsetDateTime
?
ใน java8 ฉันจะใช้Instant
คลาสที่อยู่ในUTCแล้วและสะดวกในการทำงานด้วย
import java.time.Instant;
Instant ins = Instant.now();
long ts = ins.toEpochMilli();
Instant ins2 = Instant.ofEpochMilli(ts)
หรือคุณสามารถใช้สิ่งต่อไปนี้:
import java.time.*;
Instant ins = Instant.now();
OffsetDateTime odt = ins.atOffset(ZoneOffset.UTC);
ZonedDateTime zdt = ins.atZone(ZoneId.of("UTC"));
กลับไปยัง Instant
Instant ins4 = Instant.from(odt);
Instant
เป็นได้ในเวลาท้องถิ่น Instant
โดยความหมายอยู่ใน UTC ดังนั้นไม่จำเป็นต้องใช้เครื่องจักรที่เห็นในคำตอบนี้เพื่อพยายามเข้าสู่ UTC Instant
แล้วเป็นเวลา UTC ดูคำตอบของฉันสำหรับข้อมูลเพิ่มเติมและรหัสที่ง่ายกว่ามาก
ใน Java8 คุณใช้ Time API ใหม่และแปลงInstant in เป็นZonedDateTimeโดยใช้UTC TimeZone
โซลูชัน 1 บรรทัดใน Java 8:
public Date getCurrentUtcTime() {
return Date.from(Instant.now());
}
java.util.Date
เลิกใช้แล้ว
java.util.Date
ไม่เคยเป็นวันที่เครื่องท้องถิ่น จะกำหนดเป็นมิลลิวินาทีที่ผ่านไปเสมอตั้งแต่ 1970-01-01 เทียบกับ UTC + 00: 00 บางทีพฤติกรรมของวิธีการนี้อาจtoString()
ทำให้คุณสับสนซึ่งใช้การเป็นตัวแทนในเขตเวลาท้องถิ่น