ฉันต้องการแปลงjava.time.LocalDate
เป็นjava.util.Date
ประเภท JDateChooser
เพราะผมต้องการที่จะกำหนดวันลง หรือมีตัวเลือกวันที่ที่รองรับjava.time
วันที่?
ฉันต้องการแปลงjava.time.LocalDate
เป็นjava.util.Date
ประเภท JDateChooser
เพราะผมต้องการที่จะกำหนดวันลง หรือมีตัวเลือกวันที่ที่รองรับjava.time
วันที่?
คำตอบ:
Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
ที่ถือว่าตัวเลือกวันที่ของคุณใช้เขตเวลาเริ่มต้นของระบบเพื่อแปลงวันที่ให้เป็นสตริง
atStartOfDay()
เนื่องจากจะเปลี่ยนค่าของวันที่ตามที่ฉันเข้าใจ
นี่คือคลาสยูทิลิตี้ที่ฉันใช้เพื่อแปลงjava.time
คลาสที่ใหม่กว่าเป็นjava.util.Date
อ็อบเจกต์และในทางกลับกัน:
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;
public class DateUtils {
public static Date asDate(LocalDate localDate) {
return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
}
public static Date asDate(LocalDateTime localDateTime) {
return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
}
public static LocalDate asLocalDate(Date date) {
return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDate();
}
public static LocalDateTime asLocalDateTime(Date date) {
return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDateTime();
}
}
แก้ไขตามความคิดเห็น @Oliv
ZoneId.systemDefault()
ปัญหาเนื่องจากเขตเวลาเปลี่ยนแปลงไปตามช่วงเวลาของปี ดังนั้นถ้าวันที่ 01-Jan ฉันอยู่ในเขตเวลา -05: 00 (กลาง) แต่เมื่อวันที่ 01- กรกฎาคมฉันอยู่ในเขตเวลา -06: 00 (เวลากลางวันตอนกลาง) จะไม่ทำให้เกิดผลลัพธ์ที่ไม่ถูกต้องเนื่องจากประหยัดเวลากลางวัน เวลา?
คุณสามารถใช้java.sql.Date.valueOf()
วิธีการเป็น:
Date date = java.sql.Date.valueOf(localDate);
ไม่จำเป็นต้องเพิ่มข้อมูลโซนเวลาและเวลาที่นี่เพราะข้อมูลเหล่านั้นถูกนำไปใช้โดยปริยาย
ดูLocalDate เพื่อ java.util.Date และในทางกลับกันการแปลงที่ง่ายที่สุด?
java.sql.Date
มีไว้สำหรับเลเยอร์ฐานข้อมูล JDBC, JPA ชั้นเว็บ (หรือโปรแกรมไคลเอนต์ใด ๆ ) อย่างควรเป็นอิสระจากการพึ่งพาใด ๆ java.sql.*
จาก
java.sql.Date
เป็นเพียงjava.util.Date
การตั้งค่าเวลา00:00:00
แต่จุดในมุมมองการออกแบบjava.sql.*
คือไม่ได้มีไว้สำหรับเลเยอร์ด้านหน้าที่ลูกค้าโต้ตอบกับเช่น Servlets / JSP java.util.Date
ในด้าน Java และjava.sql.Timestamp
หรือสิ่งที่บังคับจากjava.sql.*
ในด้าน JDBC
java.sql.*
คลาสJava 9 จะเป็นการพึ่งพาแยกต่างหาก
java.time มีอินเทอร์เฟซชั่วคราวซึ่งคุณสามารถใช้เพื่อสร้างวัตถุทันทีจากคลาสส่วนใหญ่ แสดงถึงมิลลิวินาทีทันทีบนไทม์ไลน์ใน Epoch - การอ้างอิงพื้นฐานสำหรับวันที่และเวลาอื่น ๆ ทั้งหมด
เราจำเป็นต้องแปลงวันที่เป็น ZonedDateTime ด้วยเวลาและโซนเพื่อทำการแปลง:
LocalDate ldate = ...;
Instant instant = Instant.from(ldate.atStartOfDay(ZoneId.of("GMT")));
Date date = Date.from(instant);
ในการสร้างjava.util.Dateจากjava.time.LocalDateคุณต้อง
รหัสอาจมีลักษณะดังนี้:
LocalDate localDate = LocalDate.now();
Date date = new Date(localDate.atStartOfDay(ZoneId.of("America/New_York")).toEpochSecond() * 1000);
toEpochSecond
java.time.chrono.ChronoZonedDateTime
ดูdocs.oracle.com/javase/8/docs/api/java/time/chrono/…
สิ่งนี้ใช้ได้กับฉัน:
java.util.Date d = new SimpleDateFormat("yyyy-MM-dd").parse(localDate.toString());
https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html#toString--
โซลูชัน Kotlin:
1) วางฟังก์ชันส่วนขยายนี้ไว้ที่ใดที่หนึ่ง
fun LocalDate.toDate(): Date = Date.from(this.atStartOfDay(ZoneId.systemDefault()).toInstant())
2) ใช้งานและไม่เคยใช้ google นี้อีก
val myDate = myLocalDate.toDate()
public static Date convertToTimeZone(Date date, String tzFrom, String tzTo) {
return Date.from(LocalDateTime.ofInstant(date.toInstant(), ZoneId.of(tzTo)).atZone(ZoneId.of(tzFrom)).toInstant());
}
ง่าย
public Date convertFrom(LocalDate date) {
return java.sql.Timestamp.valueOf(date.atStartOfDay());
}
java.util.Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());