旧版日期 - 时间码

原文: https://docs.oracle.com/javase/tutorial/datetime/iso/legacy.html

在 Java SE 8 发布之前,Java 日期和时间机制由 java.util.Datejava.util.Calendarjava.util.TimeZone 类提供,以及它们的子类,例如 java.util.GregorianCalendar。这些类有几个缺点,包括:

  • 日历类不是类型安全的。
  • 因为类是可变的,所以它们不能用于多线程应用程序。
  • 应用程序代码中的错误很常见,因为数月的数量异常且缺乏类型安全性。

与旧版代码的互操作性

也许您有遗留代码使用java.util日期和时间类,并且您希望利用java.time功能,只需对代码进行最少的更改。

添加到 JDK 8 版本的是几种允许在java.utiljava.time对象之间进行转换的方法:

以下示例将Calendar实例转换为ZonedDateTime实例。请注意,必须提供时区以从Instant转换​​为ZonedDateTime

  1. Calendar now = Calendar.getInstance();
  2. ZonedDateTime zdt = ZonedDateTime.ofInstant(now.toInstant(), ZoneId.systemDefault()));

以下示例显示DateInstant之间的转换:

  1. Instant inst = date.toInstant();
  2. Date newDate = Date.from(inst);

以下示例从GregorianCalendar转换为ZonedDateTime ,然后从ZonedDateTime转换​​为GregorianCalendar 。使用ZonedDateTime实例创建其他基于时间的类:

  1. GregorianCalendar cal = ...;
  2. TimeZone tz = cal.getTimeZone();
  3. int tzoffset = cal.get(Calendar.ZONE_OFFSET);
  4. ZonedDateTime zdt = cal.toZonedDateTime();
  5. GregorianCalendar newCal = GregorianCalendar.from(zdt);
  6. LocalDateTime ldt = zdt.toLocalDateTime();
  7. LocalDate date = zdt.toLocalDate();
  8. LocalTime time = zdt.toLocalTime();

将 java.util 日期和时间功能映射到 java.time

由于日期和时间的 Java 实现已在 Java SE 8 发行版中完全重新设计,因此您无法将一种方法替换为另一种方法。如果您想使用java.time软件包提供的丰富功能,最简单的解决方案是使用上一节中列出的toInstanttoZonedDateTime方法。但是,如果您不想使用该方法或者它不足以满足您的需求,那么您必须重写日期时间代码。

概述页面上介绍的表是开始评估哪些java.time类满足您需求的好地方。

两个 API 之间没有一对一的映射关系,但是下表让您大致了解java.util日期和时间类中哪些功能映射到java。时间 API。

java.util 功能 java.time 功能 评论
java.util.Date java.time.Instant InstantDate类相似。每个类:
  • 表示时间轴上的瞬时时间点(UTC)
  • 保持与时区无关的时间
  • 表示为纪元秒(自 1970-01-01T00:00 起) :00Z)加纳秒 Date.from(Instant)Date.toInstant()方法允许在这些类之间进行转换。 | | java.util.GregorianCalendar | java.time.ZonedDateTime | ZonedDateTime类是GregorianCalendar的替代品。它提供以下类似功能。 人体时间表示如下: LocalDate :年,月,日 LocalTime :小时,分钟,秒,纳秒 ZoneId :时区 ZoneOffset :当前偏离 GMT GregorianCalendar.from(ZonedDateTime)GregorianCalendar.to(ZonedDateTime)方法促进这些类之间的转换。 | | java.util.TimeZone | java.time.ZoneIdjava.time.ZoneOffset | ZoneId类指定时区标识符,并且可以访问每个时区使用的规则。 ZoneOffset类仅指定格林威治/ UTC 的偏移量。有关更多信息,请参阅时区和偏移类。 | | GregorianCalendar ,日期设为1970-01-01 | java.time.LocalTime | 在GregorianCalendar实例中将日期设置为 1970-01-01 以便使用时间组件的代码可以替换为LocalTime的实例。 | | GregorianCalendar ,时间设置为00:00。 | java.time.LocalDate | 为了使用日期组件,在GregorianCalendar实例中将时间设置为 00:00 的代码可以用LocalDate的实例替换。 (这GregorianCalendar的方法存在缺陷,因为由于过渡到夏令时,一些国家每年都不会出现午夜。) |

日期和时间格式

虽然java.time.format.DateTimeFormatter提供了一种强大的日期和时间值格式化机制,但您也可以直接使用java.time基于时间的类与java .util.FormatterString.format ,使用与java.util日期和时间类相同的基于模式的格式。