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

有没有一种简单的方法将LocalDate (随Java 8引入)转换为java.util.Date对象?
通过“简单”,我的意思是比这更简单:

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

这对我来说似乎有些尴尬。

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

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

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

就是这样。 没有明确的时区设置,因为本地时区是隐含的。

从文档:

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

java.sql.Date子类java.util.Date所以结果也是一个java.util.Date

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

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

TL;博士

有没有一种简单的方法将LocalDate(随Java 8引入)转换为java.util.Date对象? 通过“简单”,我的意思是比这更简单

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

 java.util.Date.from( myLocalDate.atStartOfDay( ZoneId.of( "America/Montreal" ) ).toInstant() ) 

阅读下面的问题,然后考虑一下。 怎么会更简单? 如果你问我几点开始的时间,我还能怎么回答,但问你“Where?”? 在法国巴黎FR之前的一个新的一天,在加利福尼亚州的蒙特利尔,早些时候在加尔各答,甚至更早的奥克兰新西兰,都是不同的时刻。

因此,在将仅限date( LocalDate )转换为date时间时,我们必须应用时区( ZoneId )来获取分区值( ZonedDateTime ),然后移至UTC( Instant )以匹配java.util.Date的定义java.util.Date

细节

首先,尽可能避免使用java.util.Date等旧的遗留date时间类。 他们devise不好,令人困惑,麻烦。 实际上,由于许多原因,它们被java.time类所取代。

但是,如果您必须,您可以将java.timetypes转换为旧的。 寻找新的转换方法添加到旧的类。

java.util.Datejava.time.LocalDate

请记住, java.util.Date是一个误称,因为它表示一个date加上 UTC中的时间。 相反, LocalDate类仅表示没有时间和不带时区的仅限date的值。

java.util.Date到java.time意味着转换为java.time.Instant的等价类。 Instant类表示UTC时间轴上的一个时刻,分辨率为纳秒 (最多九(9)位小数)。

 Instant instant = myUtilDate.toInstant(); 

LocalDate类代表没有时间和没有时区的只有date的值。

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

所以我们需要把这个Instant移到一个时区。 我们应用ZoneId来获得ZonedDateTime

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

从那里,请求只有一个date,一个LocalDate

 LocalDate ld = zdt.toLocalDate(); 

java.time.LocalDatejava.util.Date

为了移动另一个方向,从java.time.LocalDatejava.util.Date意味着我们将从一个仅限于date的时间开始到一个date时间。 所以我们必须指定一个时间。 你可能想要去一天的第一个时刻。 不要以为是00:00:00 。 夏令时(DST)等exception意味着第一时刻可能是另外一个时间,如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 ); 

更多信息

  • Oracle教程
  • 类似的问题, 将java.util.Date转换为什么“java.time”types?

date – > LocalDate:

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

LocalDate – >date:

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

您可以将java.util.Date对象转换为String对象,该对象将date格式设置为yyyy-mm-dd。

LocalDate有一个parse方法,将其转换为LocalDate对象。 该string必须表示有效的date,并使用DateTimeFormatter.ISO_LOCAL_DATE进行分析。

date到LocalDate

 LocalDate.parse(Date.toString()) 

我解决了这个问题,解决scheme如下

  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以这种格式打印date“yyyy-MM-dd”