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

将java.time.LocalDate转换为java.util.Date类型,java,java-8,java-time,Java,Java 8,Java Time,我想转换成类型。因为我想将日期设置为JDateChooser。或者是否有支持日期的日期选择器 假设您的日期选择器使用系统默认时区将日期转换为字符串。要从java.time.LocalDate创建java.util.date,您必须 将时间添加到LocalDate 解释时区内的日期和时间 获取自历元以来的秒/毫秒数 创建一个java.util.Date 代码可能如下所示: LocalDate localDate = LocalDate.now(); Date date = new Date(l

我想转换成类型。因为我想将日期设置为
JDateChooser
。或者是否有支持日期的日期选择器

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

要从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);

time有一个临时接口,您可以使用它从大多数时间类创建即时对象。Instant表示历元中时间轴上的毫秒-所有其他日期和时间的基准参考

我们需要将日期转换为带时间和区域的ZoneDateTime,以执行转换:

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

下面是一个实用程序类,用于将较新的
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 comment编辑。

免责声明:仅用于说明现有java API。不应在生产代码中使用

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

Date date = java.sql.Date.valueOf(localDate);
无需在此处添加时间和时区信息,因为它们是隐式获取的。
请参见

这对我很有用:

java.util.Date d = new SimpleDateFormat("yyyy-MM-dd").parse(localDate.toString());
简单

public Date convertFrom(LocalDate date) {
    return java.sql.Timestamp.valueOf(date.atStartOfDay());
}

Kotlin解决方案:

1) 将此扩展函数粘贴到某个位置

fun LocalDate.toDate(): Date = Date.from(this.atStartOfDay(ZoneId.systemDefault()).toInstant())
2) 使用它,再也不要用谷歌搜索了

val myDate = myLocalDate.toDate()


你读过吗?LGoodDatePicker本机使用java.time包(又名java 8 time,或者更确切地说,LGoodDatePicker使用“java.time.LocalDate”来存储日期值。屏幕截图和演示位于。更多答案可以在以下位置找到:区域id(ZoneIf)LocalDate中的拼写错误。atStartOfDay()创建一个ZonedDateTime,但没有toepchSecond()ZonedDateTime的方法。@KevinSadler:Toepochssecond方法继承自
java.time.chrono.ChronoZonedDateTime
。请参阅@nosid谢谢您的更正。当我在Eclipse中使用代码补全时(和toInstance)不是作为选项出现的。但是如果我完整地键入它,它似乎会被接受。我错误地认为它不是一个方法,因为这个事实,我没有在Javadoc for ZonedDateTime上看到它,因为正如您所说,它被列为一个继承的方法。抱歉,请接受一个向上单击:)
java.sql.Date
是针对数据库层的,JDBC,JPA。web层(或任何客户端应用程序)应该绝对不受
java.sql.*
@Tiny java.sql.Date驻留在rt.jar中的任何依赖项的影响。没有任何外部依赖关系。您只需使用语言特性。
java.sql.Date
只是
java.util.Date
,其时间设置为
00:00:00
,但从设计角度来看,
java.sql.
并不适用于客户端与servlet/JSP等交互的前端层。根据java.time.*作者:,这是一个“可怕的黑客”。在Java9中,
Java.sql.*
类将是一个独立的依赖项。如果这是一个可怕的黑客攻击,为什么Java不在Java.util中包含这个简单的东西。。java一天比一天疯狂,请解释您的解决方案。这是非常低效的转换为Instant可能会很冗长,但构建和解析字符串就像从纽约经东京到墨西哥城……是的,效率不高,但大多数解决方案都非常冗长。这只是冗长,更容易阅读和理解。@ehecatl小心。。。未来,纽约->东京->墨西哥城可能在一小时内完成;)我不知道为什么,但使用此转换,我得到了1893年4月之前日期的错误结果。是否可以避免
atStartOfDay()
,因为据我所知,它会更改日期的值。@JBNizet您的答案对我来说没有多大意义,这就是我决定澄清的原因。你为什么不澄清一下,而不是做一些无用的评论呢?因为我不明白为什么需要澄清。232人对这个答案投了赞成票,因此发现答案很清楚。你说atStartOfDay改变了日期的值。那没有道理。atStartOfDay执行javadoc所说的操作:它在同一天的开始将LocalDate转换为LocalDateTime。@cornz您确定结果不正确吗?如果你在德国,那么这可能与1893年4月德国时间的6分32秒故障有关。有关详细信息,请参阅“切换到Kotlin”如何简单?这是一个Java问题。将Java LocalDate转换为Date对于任何JVM开发人员来说都是一个常见的、恼人的问题。这是Kotlin开发人员的解决方案。谢谢!我正在寻找Kotlin解决方案。使用
ZoneId.systemDefault()
没有问题,因为时区会随着年份的变化而变化。因此,如果1月1日我在时区05:00(中央),但7月1日我在时区06:00(中央日光),这不会因为夏令时而导致不准确的结果吗?你的答案与4年后接受的答案有什么不同?复制粘贴以提高声誉?
fun LocalDate.toDate(): Date = Date.from(this.atStartOfDay(ZoneId.systemDefault()).toInstant())
val myDate = myLocalDate.toDate()
java.util.Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
    LocalDate date = LocalDate.now();
    DateFormat formatter = new SimpleDateFormat("dd-mm-yyyy");
    try {
        Date utilDate= formatter.parse(date.toString());
    } catch (ParseException e) {
        // handle exception
    }