LocalDate 到 java.util.Date 反之亦然最简单的转换?

有没有一种简单的方法可以将 LocalDate(由 Java8引入)转换为 java.util.Date对象?

我说的“简单”是指比这更简单:

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

这对我来说有点尴尬。

既然我们只对日期部分感兴趣,而且这两个对象中都没有时区信息,那么为什么要显式地引入时区呢?转换应该隐式地采用午夜时间和系统默认时区。

240972 次浏览

免责声明: 虽然下面的答案有效,但是不建议在生产代码中使用。在这种情况下,应该遵循巴兹尔答案中的方法。

实际上是有的。在 java.sql.Date对象中有一个静态方法 价值,它正是这样做的。所以我们有

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

就是这样。没有显式的时区设置,因为本地时区是隐式的。

来自文件:

提供的 LocalDate 被解释为本地中的本地日期 时区。

java.sql.Date的子类 java.util.Date,因此结果也是 java.util.Date

对于反向操作,java.sql.Date 类中有一个 ToLocalDate方法,所以我们有:

LocalDate ld = new java.sql.Date(date.getTime()).toLocalDate();

可以将 java.util.Date对象转换为 String对象,该对象将日期格式化为 yyyy-mm-dd。

LocalDate 有一个 parse方法,该方法将其转换为 LocalDate对象。字符串必须表示有效的日期,并使用 DateTimeFormatter.ISO _ LOCAL _ DATE 进行分析。

到 LocalDate 的日期

LocalDate.parse(Date.toString())

博士

有没有一种简单的方法可以将 LocalDate (由 Java8引入)转换为 Java.util。约会对象?我说的“简单”是指比这更简单

不,你做得很好,而且尽可能简洁。

java.util.Date.from(                     // Convert from modern java.time class to troublesome old legacy class.  DO NOT DO THIS unless you must, to inter operate with old code not yet updated for java.time.
myLocalDate                          // `LocalDate` class represents a date-only, without time-of-day and without time zone nor offset-from-UTC.
.atStartOfDay(                       // Let java.time determine the first moment of the day on that date in that zone. Never assume the day starts at 00:00:00.
ZoneId.of( "America/Montreal" )  // Specify time zone using proper name in `continent/region` format, never 3-4 letter pseudo-zones such as “PST”, “CST”, “IST”.
)                                    // Produce a `ZonedDateTime` object.
.toInstant()                         // Extract an `Instant` object, a moment always in UTC.
)

阅读下面的问题,然后思考一下。怎么可能更简单呢?如果你问我约会什么时候开始,除了问你“在哪里”,我还能怎么回答?.新的一天在巴黎的黎明比在蒙特利尔更早,在加尔各答更早,甚至在 Auckland NZ 更早,所有不同的时刻。

因此,在转换日期-只(LocalDate)到日期-时间,我们 必须的应用一个时区(ZoneId)得到一个分区价值(ZonedDateTime) ,然后移动到 UTC (Instant)匹配的定义 java.util.Date

细节

首先,尽可能避免使用旧的日期时间类,如 java.util.Date。它们设计得很糟糕,令人困惑,而且很麻烦。它们被 java.time 类取代是有原因的,实际上是由于 很多的原因。

但是如果必须的话,可以将 java.time 类型转换为/从 java.time 类型转换为旧类型。寻找添加到旧类中的新转换方法。

Table of all date-time types in Java, both modern and legacy

java.util.Datejava.time.LocalDate

请记住,java.util.Date是一个错误的名称,因为它代表一个日期 还有一天的时间,以 UTC。相比之下,LocalDate类表示一个仅限于日期的值,不包含一天中的时间和时区。

java.util.Date到 java.time 意味着转换到相当于 java.time.Instant的类。Instant类代表了 协调世界时时间线上的一个时刻,其分辨率为 纳秒(最多为小数部分的9位数)。

Instant instant = myUtilDate.toInstant();

LocalDate类表示一个仅限于日期的值,不包含一天中的时间和时区。

时区对确定日期至关重要。对于任何给定的时刻,日期在全球各地区不同。例如,在 法国巴黎中午夜后的几分钟是新的一天,而在 魁北克蒙特利尔中仍然是“昨天”。

所以我们需要将 Instant移动到一个时区,我们应用 ZoneId得到 ZonedDateTime

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );

从那里,要求一个日期-只,一个 LocalDate

LocalDate ld = zdt.toLocalDate();

java.time.LocalDatejava.util.Date

java.time.LocalDatejava.util.Date,意味着我们正在从一个日期到一个日期时间。所以我们必须指定一个时间段。你可能想在一天的第一时间去。是否假设 没有00:00:00。异常现象如夏时制(dST)意味着第一个时刻可能是另一个时刻,如 01:00:00。让 java.time 通过调用 LocalDate上的 atStartOfDay来确定这个值。

ZonedDateTime zdt = myLocalDate.atStartOfDay( z );

现在提取 Instant

Instant instant = zdt.toInstant();

通过调用 from( Instant )将该 Instant转换为 java.util.Date

java.util.Date d = java.util.Date.from( instant );

更多信息


关于 爪哇时间

< em > java.time 框架内置于 Java8及更高版本中。这些类取代了令人讨厌的旧的 遗产日期时间类,如 java.util.DateCalendarSimpleDateFormat

要了解更多,请参阅 < em > Oracle 教程 。并搜索堆栈溢出许多例子和解释。规范是 JSR 310

现在在 维修模式中的 尤达时间项目建议迁移到 爪哇时间类。

您可以直接与数据库交换 爪哇时间对象。使用与 JDBC 4.2或更高版本兼容的 JDBC 驱动程序。不需要字符串,不需要 java.sql.*类。Hibernate 5 & JPA 2.2支持 爪哇时间

从哪里获得 java.time 类?

Table of which java.time library to use with which version of Java or Android

< strong > Three Ten-Ultra 项目使用其他类扩展 java.time。这个项目是将来可能添加 java.time 的试验场。您可以在这里找到一些有用的类,比如 IntervalYearWeekYearQuarter更多

我用下面的解答解决了这个问题

  import org.joda.time.LocalDate;
Date myDate = new Date();
LocalDate localDate = LocalDate.fromDateFields(myDate);
System.out.println("My date using Date" Nov 18 11:23:33 BRST 2016);
System.out.println("My date using joda.time LocalTime" 2016-11-18);

在本例中,localDate 以“ yyyy-MM-dd”格式打印日期

日期-> 本地日期:

LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();

LocalDate-> 日期:

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

将 LocalDateTime 转换为 java.util.Date

    LocalDateTime localDateTime = LocalDateTime.now();


ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneOffset.systemDefault());


Instant instant = zonedDateTime.toInstant();


Date date = Date.from(instant);


System.out.println("Result Date is : "+date);

到 LocalDate 的日期

Date date = new Date();
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();

LocalDate to Date

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