แปลง java.time.LocalDate เป็นประเภท java.util.Date


372

ฉันต้องการแปลงjava.time.LocalDateเป็นjava.util.Dateประเภท JDateChooserเพราะผมต้องการที่จะกำหนดวันลง หรือมีตัวเลือกวันที่ที่รองรับjava.timeวันที่?


1
คุณได้อ่านstackoverflow.com/questions/21242110/… ?
Daksh Shah

2
LGoodDatePickerกำเนิดใช้แพคเกจ java.time (หรือ Java 8 เวลาหรือJSR-310โดยเฉพาะ LGoodDatePicker ใช้ "java.time.LocalDate" เพื่อเก็บค่าวันที่ภาพหน้าจอและการสาธิตอยู่ที่.. โครงการโฮมเพจ .
BlakeTNC

คำตอบ:


560
Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());

ที่ถือว่าตัวเลือกวันที่ของคุณใช้เขตเวลาเริ่มต้นของระบบเพื่อแปลงวันที่ให้เป็นสตริง


JB Nizet อาจ Java 8 อยู่ในช่วงเริ่มต้นของการพัฒนา / เผยแพร่และ @ user3509494 กำลังทดสอบอยู่
russellhoff

2
เป็นไปได้หรือไม่ที่จะหลีกเลี่ยงatStartOfDay()เนื่องจากจะเปลี่ยนค่าของวันที่ตามที่ฉันเข้าใจ
yegor256

1
@JBN ให้คำตอบของคุณไม่สมเหตุสมผลกับฉันนั่นเป็นเหตุผลที่ฉันตัดสินใจที่จะชี้แจง ทำไมคุณไม่อธิบายให้ชัดเจนแทนที่จะแสดงความคิดเห็นที่ไร้ประโยชน์
yegor256

12
เพราะฉันไม่เห็นวิธีและเหตุผลที่จะต้องมีการชี้แจงใด ๆ 232 คนตอบโต้คำตอบนี้จึงพบว่าชัดเจน คุณบอกว่า atStartOfDay เปลี่ยนค่าของวันที่ ไม่สมเหตุสมผลเลย atStartOfDay ทำสิ่งที่ javadoc บอกว่าทำ: มันจะแปลง LocalDate เป็น LocalDateTime ในวันที่เดียวกันและที่จุดเริ่มต้นของวัน
JB Nizet

2
@cornz คุณแน่ใจหรือว่าผลลัพธ์ของคุณไม่ถูกต้อง? หากคุณอยู่ในประเทศเยอรมนีอาจเป็นเรื่องเกี่ยวกับความผิดพลาด 6 นาที 32 วินาทีในเยอรมนีในเดือนเมษายน 1893 ดูtimeanddate.com/time/zone/germany/berlin?syear=1850สำหรับรายละเอียดบางอย่าง .
Dawood ibn Kareem

104

นี่คือคลาสยูทิลิตี้ที่ฉันใช้เพื่อแปลง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 (เวลากลางวันตอนกลาง) จะไม่ทำให้เกิดผลลัพธ์ที่ไม่ถูกต้องเนื่องจากประหยัดเวลากลางวัน เวลา?
jhilden

94

คุณสามารถใช้java.sql.Date.valueOf()วิธีการเป็น:

Date date = java.sql.Date.valueOf(localDate);

ไม่จำเป็นต้องเพิ่มข้อมูลโซนเวลาและเวลาที่นี่เพราะข้อมูลเหล่านั้นถูกนำไปใช้โดยปริยาย
ดูLocalDate เพื่อ java.util.Date และในทางกลับกันการแปลงที่ง่ายที่สุด?


นี่เหมาะสำหรับฉันเนื่องจากสิ่งที่ฉันต้องการคือการส่ง LocalDate ไปยัง SQL อย่างไรก็ตามหากตัวจัดรูปแบบวันที่ของคุณกำลังจะทำอะไรบางอย่างเกี่ยวกับการเปลี่ยนเขตเวลาก่อนที่จะจัดรูปแบบวันที่คุณอาจได้รับวันหนึ่งเร็วเกินไปทั้งนี้ขึ้นอยู่กับเขตเวลาท้องถิ่นในกรณีนี้คุณจะต้องการหนึ่งในตัวเลือกข้างต้นแทน
Tom Dibble

7
java.sql.Dateมีไว้สำหรับเลเยอร์ฐานข้อมูล JDBC, JPA ชั้นเว็บ (หรือโปรแกรมไคลเอนต์ใด ๆ ) อย่างควรเป็นอิสระจากการพึ่งพาใด ๆ java.sql.*จาก
Tiny

2
@Tiny java.sql.Date อยู่ใน rt.jar ไม่มีการอ้างอิงภายนอกใด ๆ คุณเพียงแค่ใช้คุณสมบัติภาษา
จอร์จ

2
java.sql.Dateเป็นเพียงjava.util.Dateการตั้งค่าเวลา00:00:00แต่จุดในมุมมองการออกแบบjava.sql.*คือไม่ได้มีไว้สำหรับเลเยอร์ด้านหน้าที่ลูกค้าโต้ตอบกับเช่น Servlets / JSP java.util.Dateในด้าน Java และjava.sql.Timestampหรือสิ่งที่บังคับจากjava.sql.*ในด้าน JDBC
เล็ก ๆ

5
นี่คือ "สับที่น่ากลัว" ตามด้วย java.time * การเขียน:. stackoverflow.com/questions/33066904/... ในjava.sql.*คลาสJava 9 จะเป็นการพึ่งพาแยกต่างหาก
Dherik

16

java.time มีอินเทอร์เฟซชั่วคราวซึ่งคุณสามารถใช้เพื่อสร้างวัตถุทันทีจากคลาสส่วนใหญ่ แสดงถึงมิลลิวินาทีทันทีบนไทม์ไลน์ใน Epoch - การอ้างอิงพื้นฐานสำหรับวันที่และเวลาอื่น ๆ ทั้งหมด

เราจำเป็นต้องแปลงวันที่เป็น ZonedDateTime ด้วยเวลาและโซนเพื่อทำการแปลง:

LocalDate ldate = ...;
Instant instant = Instant.from(ldate.atStartOfDay(ZoneId.of("GMT")));
Date date = Date.from(instant);

12

ในการสร้างjava.util.Dateจากjava.time.LocalDateคุณต้อง

  • เพิ่มเวลาในLocalDate
  • ตีความวันที่และเวลาภายในเขตเวลา
  • รับจำนวนวินาที / มิลลิวินาทีนับตั้งแต่ยุค
  • สร้างjava.util.Date

รหัสอาจมีลักษณะดังนี้:

LocalDate localDate = LocalDate.now();
Date date = new Date(localDate.atStartOfDay(ZoneId.of("America/New_York")).toEpochSecond() * 1000);

1
การสะกดผิดใน id เขต (ZoneIf)
assylias

localDate.atStartOfDay () สร้าง ZonedDateTime แต่ไม่มีเมธอด toEpochSecond () สำหรับ ZonedDateTime
Kevin Sadler

@KevinSadler: วิธีการที่จะรับมาจากtoEpochSecond java.time.chrono.ChronoZonedDateTimeดูdocs.oracle.com/javase/8/docs/api/java/time/chrono/…
nosid

@nosid ขอบคุณสำหรับการแก้ไขของคุณ เมื่อฉันใช้รหัสเสร็จใน Eclipse มัน (และ toInstance) ไม่ปรากฏเป็นตัวเลือก แต่ถ้าฉันพิมพ์เต็มดูเหมือนว่าจะได้รับการยอมรับ ฉันสรุปผิดว่ามันไม่ใช่วิธีการเนื่องจากความจริงข้อนี้และฉันไม่เห็นมันใน Javadoc สำหรับ ZonedDateTime เนื่องจากมีการระบุว่าเป็นวิธีที่สืบทอดมาตามที่คุณพูด ขออภัยโปรดยอมรับการคลิกที่นี่ :)
Kevin Sadler

11

สิ่งนี้ใช้ได้กับฉัน:

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--


6
นี้ค่อนข้างไม่มีประสิทธิภาพ
AndresQ

1
แปลงไปทันทีอาจจะ verbose แต่การสร้างและการแยกสตริงเป็นเหมือนไปจากนิวยอร์กไปยังเม็กซิโกซิตี้ผ่านโตเกียว ...
Ehecatl

1
ใช่ไม่ได้มีประสิทธิภาพมากนัก แต่โซลูชันส่วนใหญ่มีความละเอียดมาก นี่เป็นเพียง verbose และง่ายต่อการอ่านและทำความเข้าใจ
ceklock

2
@ehecatl ระวัง ... ในอนาคต NY -> โตเกียว -> เม็กซิโกซิตี้สามารถทำได้ภายในไม่กี่ชั่วโมง;)
Stephan

3

โซลูชัน Kotlin:

1) วางฟังก์ชันส่วนขยายนี้ไว้ที่ใดที่หนึ่ง

fun LocalDate.toDate(): Date = Date.from(this.atStartOfDay(ZoneId.systemDefault()).toInstant())

2) ใช้งานและไม่เคยใช้ google นี้อีก

val myDate = myLocalDate.toDate()

11
"เปลี่ยนเป็น Kotlin" ง่ายแค่ไหน? นี่เป็นคำถามเกี่ยวกับ Java
ehecatl

1
การแปลง Java LocalDate เป็น Date เป็นปัญหาที่พบบ่อยและน่ารำคาญสำหรับผู้พัฒนา JVM นี่เป็นวิธีแก้ปัญหาสำหรับนักพัฒนา Kotlin
gyoder



-3
java.util.Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());

คำตอบของคุณแตกต่างจากคำตอบที่ยอมรับหลังจาก 4 ปี คัดลอกวางเพื่อให้ได้ชื่อเสียงเพิ่มขึ้น?
เหล็กที่
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.