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

时间:2015-10-11 15:48:03

标签: java date java-8 java-time

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

通过'简单',我的意思是比这更简单:

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

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

由于我们只对日期部分感兴趣,并且两个对象中都没有时区信息,为什么要明确引入时区?应该隐式采用午夜时间和系统默认时区进行转换。

7 个答案:

答案 0 :(得分:118)

实际上有。 java.sql.Date对象中有一个静态方法valueOf就是这样做的。所以我们有

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

就是这样。没有明确设置时区,因为隐式采用了本地时区。

来自docs:

  

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

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

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

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

答案 1 :(得分:72)

TL;博士

  

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

不。你做得恰当,尽可能简洁。

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.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.
)

请阅读下面的问题,然后再考虑一下。怎么会更简单?如果你问我约会的时间是什么时候开始的,我怎么回答却问你“哪里?”?新的一天在巴黎FR早些时候比在加利福尼亚州的蒙特利尔,早些时候在加尔各答IN,甚至早些时候在新西兰奥克兰,所有不同的时刻。

因此,在将仅限日期(LocalDate)转换为日期时,我们必须应用时区(ZoneId)才能获得分区值({{ 1}}),然后转入UTC(ZonedDateTime)以匹配Instant的定义。

详细

首先,尽可能避免旧的遗留日期时间类,例如java.util.Date。它们的设计很糟糕,令人困惑,也很麻烦。实际上,出于某种原因,它们被java.time类取代了许多的原因。

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

java.util.Datejava.util.Date

请注意,java.time.LocalDate是一个误称,因为它代表一个日期加上一个时间段,以UTC为单位。相反,LocalDate类表示没有时间且没有时区的仅日期值。

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

java.time.Instant

LocalDate类表示没有时间且没有时区的仅限日期的值。

时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因地区而异。例如,在Paris France午夜后的几分钟是新的一天,而Montréal Québec中仍然是“昨天”。

所以我们需要将Instant instant = myUtilDate.toInstant(); 移到时区。我们应用Instant来获取ZoneId

ZonedDateTime

从那里,请求仅限日期,ZoneId z = ZoneId.of( "America/Montreal" ); ZonedDateTime zdt = instant.atZone( z );

LocalDate

LocalDate ld = zdt.toLocalDate(); java.time.LocalDate

要移动另一个方向,从java.util.Datejava.time.LocalDate意味着我们将从仅限日期转到日期时间。所以我们必须指定一个时间。你可能想要一天中的第一时间。 假设是java.util.Date。夏令时(DST)等异常意味着第一时刻可能是另一个时间,例如00:00:00。让java.time通过调用01:00:00上的atStartOfDay确定该值。

LocalDate

现在提取ZonedDateTime zdt = myLocalDate.atStartOfDay( z );

Instant

通过调用from( Instant )Instant instant = zdt.toInstant(); 转换为Instant

java.util.Date

更多信息

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

关于 java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.util.Date d = java.util.Date.from( instant ); 类。

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 2 :(得分:15)

日期 - > LOCALDATE:

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

LocalDate - >日期:

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

答案 3 :(得分:2)

DateDate日期

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());

答案 4 :(得分:0)

将LocalDateTime转换为java.util.Date

AttributeError: 'zipline.assets._assets.Equity' object has no attribute 'history'

答案 5 :(得分:-2)

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

_sprites = new List<Sprite>()
{
    new Sprite(_content.Load<Texture2D>("Content/Block.png")) 
    { 
         Position = new Vector2f(100, 100), 
         Input = new Input(Key.A, Key.D, Key.W, Key.S),
    },
 };

在这种情况下,localDate会以“yyyy-MM-dd”格式打印您的日期

答案 6 :(得分:-4)

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

LocalDate有一个parse方法,可将其转换为LocalDate对象。该字符串必须表示有效日期,并使用DateTimeFormatter.ISO_LOCAL_DATE进行解析。

DateDate日期

LocalDate.parse(Date.toString())