Java ZonedDateTime

时间:2020-01-09 10:35:57  来源:igfitidea点击:

Java 8日期时间API中的ZonedDateTime类表示带有时区信息的日期和时间。这可能是世界某处特定事件的开始,例如会议,火箭发射等。

ZonedDateTime类是不可变的。这意味着所有在" ZonedDateTime"对象上执行计算的方法都返回一个新的" ZonedDateTime"实例。

创建一个ZonedDateTime对象

我们可以通过几种方式创建" ZonedDateTime"对象。第一种方法是调用" ZonedDateTime"类的" now()"方法。这是一个使用now()方法创建ZonedDateTime对象的示例:

ZonedDateTime zonedDateTime = ZonedDateTime.now();

创建" ZonedDateTime"对象的另一种方法是使用" of()"方法,该方法可以根据具体的日期和时间创建" ZonedDateTime"对象。这是一个使用of()方法创建ZonedDateTime对象的示例:

ZoneId zoneId = ZoneId.of("UTC+1");

ZonedDateTime zonedDateTime2 =
    ZonedDateTime.of(2014, 11, 30, 23, 45, 59, 1234, zoneId);

访问ZonedDateTime的日期和时间

我们可以使用以下方法之一访问" ZonedDateTime"实例的日期和时间字段:

  • getYear()
  • getMonth()
  • getDayOfMonth()
  • getDayOfWeek()
  • getDayOfYear()
  • getHour()
  • getMinute()
  • getSecond()
  • getNano()

这是访问ZonedDateTime的年份的示例:

int year = ZonedDateTime.now().getYear();

这些方法中的一些返回"枚举",而其他方法则返回" int"。在enum中,我们可以使用其getValue()方法返回其值的int表示形式。例如:

int month = ZonedDateTime.now()
              .getMonth().getValue();

日期和时间计算

ZonedDateTime类包含一组用于日期时间计算的方法。其中一些方法是:

  • plusYears()
  • plusMonths()
  • plusDays()
  • plusHours()
  • plusMinutes
  • plusSeconds
  • plusNanos()
  • minusYears()
  • minusMonths()
  • minusDays()
  • minusHours()
  • minusMinutes
  • minusSeconds
  • minusNanos()

请注意,跨越夏时制更改(开始或者结束)的计算可能无法给出我们期望的结果!一种替代方法是使用" Period"实例,如下所示:

ZonedDateTime newZoneDateTime =
    previousDateTime.plus(Period.ofDays(3));

这将导致更正确的计算。

时区

时区由" ZoneId"类表示,如前面的示例所示。我们可以使用ZoneId.now()方法创建一个ZoneId对象。这是一个例子:

ZoneId zoneId = ZoneId.of("UTC+1");

传递给of()方法的参数是为其创建ZoneId的时区的ID。在上面的示例中,ID为" UTC + 1",这是相对于UTC(格林威治)时间的偏移。我们可以找到所需时区的UTC偏移量,并通过将" UTC"与偏移量(例如" +1"或者" -5")组合在一起来创建与之匹配的ID。

我们还可以使用另一种类型的时区ID,该ID由时区处于活动状态的位置的名称组成。这是一个例子:

ZoneId zoneId2 = ZoneId.of("Europe/Copenhagen");

ZoneId zoneId3 = ZoneId.of("Europe/Paris");