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

Kav*_*han 338 java java-8 java-time

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

JB *_*zet 528

Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
Run Code Online (Sandbox Code Playgroud)

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

  • 因为我不知道如何以及为什么需要澄清.有232人赞同这个答案,因此很清楚.你说atStartOfDay改变了日期的值.这没有意义.atStartOfDay执行javadoc所说的:它将LocalDate转换为LocalDateTime,在同一天和当天开始. (9认同)
  • 据我了解,有可能避免`atStartOfDay()`,因为它会更改日期的值。 (2认同)
  • @yegor256 你的评论对我来说没有多大意义。你为什么不问自己的问题而不是评论一个很老的问题呢? (2认同)
  • @JBNizet 你的回答对我来说没有多大意义,这就是我决定澄清的原因。你为什么不澄清它而不是发表无用的评论? (2认同)
  • @cornz您确定结果不正确吗?如果您在德国,那可能与1893年4月在德国发生的6分钟32秒故障有关。请参阅https://www.timeanddate.com/time/zone/germany/berlin? syear = 1850了解更多详细信息。 (2认同)

Bri*_*ace 97

这是我用来将较新的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();
  }
}
Run Code Online (Sandbox Code Playgroud)

根据@Oliv评论编辑.


Geo*_*rge 90

您可以使用java.sql.Date.valueOf()方法:

Date date = java.sql.Date.valueOf(localDate);
Run Code Online (Sandbox Code Playgroud)

无需在此处添加时间和时区信息,因为它们是隐式使用的.
请参阅LocalDate到java.util.Date,反之亦然最简单的转换?

  • `java.sql.Date`适用于数据库层,JDBC,JPA.Web层(或任何客户端应用程序)应绝对不受`java.sql.*`的任何依赖. (3认同)
  • 如果这是可怕的 hack 为什么 java 不在 java.util 中包含这个简单的东西.. 日复一日,java 变得比 b4 更疯狂 (3认同)
  • @Tiny java.sql.Date驻留在rt.jar中.没有任何外部依赖项.您只需使用语言功能. (2认同)
  • `java.sql.Date` 只是 `java.util.Date`,其时间设置为 `00:00:00` 但设计角度的要点是 `java.sql.*` 不是用于前层哪些客户端与 Servlets/JSP 等交互。[Java 端的`java.util.Date` 和JDBC 端的`java.sql.*` 或任何适用的`java.sql.Timestamp` 或任何适用的](http://stackoverflow.com/a/3323870/1391249)。 (2认同)
  • 根据java.time,这是一个"可怕的黑客".*作者:/sf/ask/2314683311/#comment72769769_33066935 .在Java 9中,`java.sql.*`类将是一个单独的依赖项. (2认同)

Kev*_*ler 15

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

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

LocalDate ldate = ...;
Instant instant = Instant.from(ldate.atStartOfDay(ZoneId.of("GMT")));
Date date = Date.from(instant);
Run Code Online (Sandbox Code Playgroud)


nos*_*sid 13

要从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);
Run Code Online (Sandbox Code Playgroud)


cek*_*ock 11

这对我有用:

java.util.Date d = new SimpleDateFormat("yyyy-MM-dd").parse(localDate.toString());
Run Code Online (Sandbox Code Playgroud)

https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html#toString--

  • 这是非常低效的 (6认同)
  • 转换为 Instant 可能很冗长,但是构建和解析字符串就像从纽约经东京到墨西哥城...... (2认同)
  • 是的,效率不高,但大多数解决方案都非常冗长。这只是冗长的,更容易阅读和理解。 (2认同)
  • @ehecatl当心...在将来的纽约->东京->墨西哥城可能会在几小时内完成;) (2认同)

gyo*_*der 5

Kotlin解决方案:

1)将此扩展功能粘贴到某处.

fun LocalDate.toDate(): Date = Date.from(this.atStartOfDay(ZoneId.systemDefault()).toInstant())
Run Code Online (Sandbox Code Playgroud)

2)使用它,再也不要谷歌了.

val myDate = myLocalDate.toDate()
Run Code Online (Sandbox Code Playgroud)

  • "切换到Kotlin"怎么样简单?这是一个Java问题. (15认同)
  • 将 Java LocalDate 转换为 Date 对任何 JVM 开发人员来说都是一个常见的、烦人的问题。这是 Kotlin 开发人员的解决方案。 (3认同)
  • 谢谢!我正在寻找 Kotlin 解决方案。 (2认同)