gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 11:20:46 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Convert java.time.LocalDate into java.util.Date type

(11 个回答)


3年前关闭。




有没有一种简单的方法来转换 LocalDate (在 Java 8 中引入)到 java.util.Date对象?

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

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

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

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

最佳答案

tl;博士

Is there a simple way to convert a LocalDate (introduced with Java 8) to java.util.Date object? By 'simple', I mean simpler than this


不。你做得对,而且尽可能简洁。
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.
)
阅读下面的问题,然后思考。怎么可能更简单?如果你问我约会从几点开始,除了问你“在哪里?”之外,我还能怎么回答?新的一天在法国巴黎比在加拿大蒙特利尔更早,在加尔各答更早,在新西兰奥克兰更早,所有不同的时刻。
因此,在将仅限日期的 ( 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 class 表示没有时间和时区的仅日期值。
来自 java.util.Date到 java.time 意味着转换为 java.time.Instant 的等效类. Instant class 代表时间线上的一个时刻 UTC分辨率为 nanoseconds (最多九 (9) 位小数)。
Instant instant = myUtilDate.toInstant();
LocalDate class 表示没有时间和时区的仅日期值。
时区对于确定日期至关重要。对于任何给定时刻,日期因地区而异。例如,午夜过后几分钟 Paris FranceMontréal Québec 中仍然是“昨天”是新的一天.
所以我们需要移动那个 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 通过调用 atStartOfDay 确定该值在 LocalDate .
ZonedDateTime zdt = myLocalDate.atStartOfDay( z );
现在提取一个 Instant .
Instant instant = zdt.toInstant();
转换那个 Instantjava.util.Date调用 from( Instant ) .
java.util.Date d = java.util.Date.from( instant );
更多信息
  • Oracle Tutorial
  • 类似问题,Convert java.util.Date to what “java.time” type?

  • 关于 java.time
    java.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy日期时间类,例如 java.util.Date , Calendar , & SimpleDateFormat .
    要了解更多信息,请参阅 Oracle Tutorial .并在 Stack Overflow 上搜索许多示例和解释。规范为 JSR 310 .
    Joda-Time项目,现在在 maintenance mode ,建议迁移到 java.time类。
    您可以直接与您的数据库交换 java.time 对象。使用 JDBC driver符合 JDBC 4.2或以后。不需要字符串,不需要 java.sql.*类。 Hibernate 5 & JPA 2.2 支持 java.time。
    从哪里获得 java.time 类?
  • Java SE 8 , Java SE 9 , Java SE 10 , Java SE 11 ,以及更高版本 - 标准 Java API 的一部分,具有捆绑的实现。
  • Java 9带来了一些小功能和修复。

  • Java SE 6Java SE 7
  • 大多数 java.time 功能在 ThreeTen-Backport 中向后移植到 Java 6 和 7。 .

  • Android
  • 更高版本的 Android (26+) 捆绑了 java.time 类的实现。
  • 对于早期的 Android (<26),一个名为 API desugaring 的进程带来了 subset of the java.time最初未内置于 Android 中的功能。
  • 如果脱糖不能满足您的需求,ThreeTenABP项目适应 ThreeTen-Backport (上面提到的)到Android。见 How to use ThreeTenABP… .



  • Table of which java.time library to use with which version of Java or Android
    ThreeTen-Extra项目使用附加类扩展 java.time。该项目是 future 可能添加到 java.time 的试验场。您可能会在这里找到一些有用的类,例如 Interval , YearWeek , YearQuarter , 和 more .

    关于java - LocalDate 到 java.util.Date 反之亦然最简单的转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33066904/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com