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.Date
→ java.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.LocalDate
→ java.util.Date
为了移动另一个方向,从java.time.LocalDate
到java.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”