当前位置: 首页 > 知识库问答 >
问题:

将java.util.date转换为什么“java.time”类型?

许阿苏
2023-03-14

共有1个答案

虞展
2023-03-14

是的,您绝对应该尽可能地使用java.time框架。

旧的日期-时间类,包括java.util.Datejava.util.Calendarjava.text.SimpleTextFormat等,已经证明设计不佳、令人困惑和麻烦。尽可能避开他们。但是当您必须与这些旧类型互操作时,您可以在新旧之间进行转换。

继续阅读基本的介绍,有点过于简化,以指导您在旧的和新的日期时间类之间来回移动。

通常,您应该在UTC中执行大部分业务逻辑。在这样的工作中,即时会经常使用。传递instant对象,应用时区仅用于显示给用户。当您确实需要应用偏移量或时区时,请使用下面进一步介绍的类型。

鉴于instantjava.util.date都是UTC时间线上的一个时刻,我们可以很容易地从java.util.date转移到instant。旧类获得了一个新方法java.util.date::ToInstant

Instant instant = myUtilDate.toInstant();

您可以转向另一个方向,从instantjava.util.date。但您可能会丢失有关小数秒的信息。即时跟踪最多九位小数点后的纳秒,如2016-01-23T12:34:56.123456789Z。java.util.date和calendar都限制为毫秒,最多为小数点后的三位数字,如2016-01-23T12:34:56.123Z。在本例中,从即时日期意味着对456789的截断。

java.util.Date myUtilDate = java.util.Date.from(instant);
Instant instant = myUtilCalendar.toInstant() ;

Calendar的接口向下传送到GregorianCalendar的具体类。然后调用ToZonedDateTimeFrom方法进行往返。

if (myUtilCalendar instanceof GregorianCalendar) {
    GregorianCalendar gregCal = (GregorianCalendar) myUtilCalendar; // Downcasting from the interface to the concrete class.
    ZonedDateTime zdt = gregCal.toZonedDateTime();  // Create `ZonedDateTime` with same time zone info found in the `GregorianCalendar`
}

往另一个方向走…

java.util.Calendar myUtilCalendar = java.util.GregorianCalendar.from(zdt); // Produces an instant of `GregorianCalendar` which implements `Calendar` interface.

正如上面所讨论的,注意你可能会丢失关于一秒钟的信息。java.time类型(zoneddatetime)中的纳秒在.calendar/.gregorianCalendar中被截断为毫秒。

ZoneOffset offset = ZoneOffset.of("-04:00"); 
OffsetDateTime odt = OffsetDateTime.ofInstant(instant, zoneOffset);
java.util.Date myUtilDate = java.util.Date.from(odt.toInstant());
ZoneId zoneId = ZoneId.of("America/Montreal");
ZonedDateTime zdt = ZonedDateTime.ofInstant(instant, zoneId);
java.util.Date myUtilDate = java.util.Date.from( zdt.toInstant() );

我们在上面进一步看到,ZonedDateTime可以转换为GregorianCalendar

有时,您可能需要一个只包含日期的值,而不包含一天的时间和时区。为此,请使用java.time.localdate对象

关于更多的讨论,请参见这个问题,将java.util.date转换为java.time.localdate,尤其是Joda-Time和java.Time发明背后的主要人物所写的这个答案。

LocalDate localDate = zdt.toLocalDate();
ZonedDateTime zdt = localDate.atStartOfDay(zoneId);
LocalTime localTime = zdt.toLocalTime();

例如,“今年圣诞节开始”将为2016-12-25t00:00:00.0。请注意,在localdatetime的文本表示中缺少任何偏移量或时区。印度德里的圣诞节开始得早于法国巴黎,加拿大魁北克蒙特利尔的圣诞节开始得晚。应用这些区域的每一个时区将在时间轴上产生不同的时刻。

LocalDateTime ldt = zdt.toLocalDateTime();

Java.time框架内置在Java8和更高版本中。这些类取代了麻烦的旧的遗留日期-时间类,如java.util.dateCalendar、&SimpleDateFormat

要了解更多信息,请参阅Oracle教程。并搜索堆栈溢出以获得许多示例和解释。规范是JSR310。

    null
    null
    null
 类似资料:
  • 问题内容: 我有一个对象,或一个对象。如何在java.time框架中将其转换为正确的类型? 我听说我们现在应该使用类型来做大部分业务逻辑。当使用尚未为java.time更新的旧代码时,我需要能够来回转换。什么类型映射到或? 问题答案: 避免使用旧的日期时间类 老式的日期时间类(包括,和)已被证明设计不良,混乱且麻烦。尽可能避免它们。但是,当你必须与这些旧类型进行互操作时,可以在新旧之间进行转换。

  • 问题内容: 我想转换成类型。因为我想将日期设置为。还是有任何支持日期的日期选择器? 问题答案: 假设你的日期选择器使用系统默认时区将日期转换为字符串。

  • 我正在尝试替换org.joda。现在是java时代。时间在我们的应用程序中。从那时起,我们使用的是org.joda。在时间包中,我们有一个带有org.joda.time.period的ISO8601格式的period。 由于P1Y、P1M、P1W、P1D等格式已存储在我们的系统中,因此在java.time.中寻找相同内容的格式化程序 java.time.Duration支持,小时,分钟和天。 但是

  • 问题内容: 我将日期以这种格式存储在SQLite数据库中: 当我以这种格式检索日期时,除小时外,其他一切都很好。时间总是如此。这是我的输出: 这是代码: 我究竟做错了什么? 问题答案: 我认为您的日期格式没有意义。没有13:00 PM。删除格式末尾的“ aaa”,或将HH转换为hh。 不过,这对我来说很好: 它将打印“ 2010年4月29日星期四CEST”。

  • 问题内容: 将对象转换为新的JDK 8 / JSR-310 的最佳方法是什么? 问题答案: 说明 尽管有名称,它代表时间轴上的一个瞬间,而不是“日期”。存储在对象中的实际数据是自1970-01-01T00:00Z(1970 GMT / UTC开始的午夜)以来的毫秒数。 中的等效类是,因此有一种方便的方法可以提供转换: 一个实例没有时区的概念。如果调用,这可能看起来很奇怪,因为相对于时区。但是,该方

  • 问题内容: 我想将对象转换为 Java。 格式为 问题答案: 转换日期为字符串使用方法: