将java.time.LocalDate转换为java.util.Date类型


372

我想转换java.time.LocalDatejava.util.Date类型。因为我想将日期设置为JDateChooser。还是有任何支持java.time日期的日期选择器?



2
LGoodDatePicker本身使用java.time包(又名爪哇8时间,或者JSR-310具体而言,LGoodDatePicker使用“java.time.LocalDate”来存储日期值截图和演示是在。项目主页
BlakeTNC

可以在以下位置找到更多答案:LocalDate到java.util.Date,反之亦然?
罗勒·布尔克

Answers:


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

假设您的日期选择器使用系统默认时区将日期转换为字符串。


JB Nizet也许Java 8处于开发/发布的早期阶段,@ user3509494正在以某种方式对其进行测试。
russellhoff 2015年

2
atStartOfDay()我了解,是否有可能避免,因为它会更改日期的值。
yegor256

1
@JBNizet您的回答对我来说没有多大的意义,这就是为什么我决定要澄清。您为什么不澄清它而不是做出无用的评论?
yegor256

12
因为我不知道如何以及为什么需要澄清。232人赞成这个答案,因此很清楚。您说atStartOfDay更改日期的值。那没有道理。atStartOfDay就像javadoc所说的那样:在相同的日期和一天的开始将LocalDate转换为LocalDateTime。
JB Nizet

2
@cornz您确定结果不正确吗?如果您在德国,那可能与1893年6月在德国发生的6分钟32秒故障有关。有关详细信息,请参阅timeanddate.com/time/zone/germany/berlin?syear=1850
达伍德·本·卡里姆

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()时不会出现问题,因为时区会在一年中的变化中变化。因此,如果我在1月1日处于时区-05:00(中部),但是在7月1日在时区-06:00(中部夏令时)不会因为夏令时而导致结果不准确时间?
jhilden

94

您可以将java.sql.Date.valueOf()method用作:

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

无需在此处添加时间和时区信息,因为它们是隐式获取的。
参见LocalDate到java.util.Date的转换,反之亦然?


这对我来说是完美的,因为我需要的是将LocalDate传递给SQL。但是,如果您的日期格式化程序要在格式化日期之前对时区进行某些操作,则视本地时区而定,可能会提前一天,在这种情况下,您将需要上述选项之一。
汤姆·迪布尔

7
java.sql.Date用于数据库层,JDBC,JPA。Web层(或任何客户端应用程序)应绝对不受的任何依赖java.sql.*
2016年

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.Timestampjava.sql.*在JDBC方面适用
2016年

5
根据java.time。*作者:stackoverflow.com/questions/33066904/…,这是一个“可怕的黑客” 。在Java 9中,java.sql.*类将是单独的依赖项。
Dherik

16

java.time具有Temporal接口,您可以使用该接口从大多数时间类创建Instant对象。即时代表纪元时间轴上的毫秒数-所有其他日期和时间的基本参考。

我们需要将Date转换为带有时间和Zone的ZonedDateTime来进行转换:

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

12

为了从java.time.LocalDate创建一个java.util.Date,您必须

  • LocalDate添加时间
  • 解释时区中的日期和时间
  • 获取自纪元以来的秒数/毫秒
  • 创建一个java.util.Date

该代码可能如下所示:

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

1
区域ID(ZoneIf)中的
错别字

localDate.atStartOfDay()创建一个ZonedDateTime,但是ZonedDateTime没有toEpochSecond()方法。
凯文·萨德勒

@KevinSadler:该方法toEpochSecond继承自java.time.chrono.ChronoZonedDateTime。见docs.oracle.com/javase/8/docs/api/java/time/chrono/...
nosid

@nosid感谢您的纠正。当我在Eclipse中使用代码完成功能时,它(和toInstance)都不存在。但是,如果我输入完整,似乎可以接受。由于这个事实,我错误地认为这不是方法,而且正如您所说,我在Javadoc上没有针对ZonedDateTime看到它,因为它被列为继承的方法。抱歉,请接受upclick :)
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
转换为Instant可能很冗长,但是构建和解析String就像从纽约通过东京到墨西哥城...
ehecatl

1
是的,效率不高,但是大多数解决方案都很冗长。这只是冗长,更易于阅读和理解。
ceklock

2
@ehecatl当心...在未来的纽约->东京->墨西哥城可能会在几小时内完成;)
斯蒂芬

3

Kotlin解决方案:

1)将此扩展功能粘贴到某个地方。

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

2)使用它,再也不会用谷歌搜索了。

val myDate = myLocalDate.toDate()

11
“切换到Kotlin”如何简单?这是一个Java问题。
ehecatl

1
对于任何JVM开发人员来说,将Java LocalDate转换为Date是一个常见的烦人的问题。这是Kotlin开发人员的解决方案。
gyoder

-1
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());
} 

2
请说明您的解决方案。
马丁·扎贝尔


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

您的答案与4年后被接受的答案有何不同?复制粘贴以实现声誉提升?
毒刺
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.