Java ZonedDateTime详解

后端 潘老师 4周前 (10-31) 26 ℃ (0) 扫码查看

了解Java中的ZonedDateTime类,如何创建其实例以及诸如解析、格式化和添加持续时间和时间段的用例。

1.概述

java.time.ZonedDateTime类是在Java 8日期时间API中引入的,表示带有区域id和区域偏移量信息的ISO-8601日历系统中的日期和时间。该类将所有日期和时间字段存储到纳秒精度。

ZonedDateTime实例可用于将普遍时间线中的实例转换为LocalDateTime,其中差异是区域偏移量,并且偏移量是根据时区规则计算的。请注意,当夏令时(DST)切换时,时区id在一年中可能有不同的偏移量。在这种情况下,ZonedDateTime始终具有该时区的当前偏移量。

我们可以在需要向全球分布式用户表示时间的情况下使用ZonedDateTime实例。例如,我们可以将其用于通信会议日期,与会者将根据其本地日期和时间在线连接。

ZonedDateTime保存的状态相当于三个单独的对象:一个LocalDateTime、一个ZoneId以及解析的ZoneOffset。

ZonedDateTime实例是不可变的,线程安全的。该类定义如下:

public final class ZonedDateTime
    extends Object
    implements Temporal, ChronoZonedDateTime<LocalDate>, Serializable
{
    //类体
}

2. 创建ZonedDateTime

通常,我们将在两种情况下创建ZonedDateTime实例,即获取当前时间戳或创建一个具有特定时区ID和偏移量的时间戳。

2.1获取当前时间戳

使用now()方法获取具有当前时区ID和偏移量的当前时间戳。要获取另一个时区的相同实例,请将时区ID传递给now()方法。

ZonedDateTime now = ZonedDateTime.now();
ZonedDateTime now = ZonedDateTime.now( ZoneId.of("GMT+08:00") );

2.2 使用值创建ZonedDateTime

要使用给定的日期、时间和时区信息创建时间戳,请使用of()方法,该方法接受各种参数以形成实例。

ZoneId zoneId = ZoneId.of("UTC+1");
ZonedDateTime zdt = ZonedDateTime.of(2015, 11, 30, 23, 45, 59, 1234, zoneId);
//从其他local实例创建
LocalDate localDate = LocalDate.of(2019, 03, 12);
LocalTime localTime = LocalTime.of(12,  44);
ZoneId zoneId = ZoneId.of("GMT+05:30");
ZonedDateTime timeStamp = ZonedDateTime.of( localDate, localTime, zoneId );

3.将字符串解析为ZonedDateTime

ZonedDateTime类具有两个重载的parse()方法,将字符串转换为ZonedDateTime实例。

parse(CharSequence text)    //1
parse(CharSequence text, DateTimeFormatter formatter)    //2
  • 如果字符串包含ISO_ZONED_DATE_TIME模式中的时间,即2019-03-28T10:15:30+01:00[Europe/Paris],请使用第一个方法。这是默认模式。
  • 对于任何其他日期时间模式,我们需要使用第二个方法,我们将日期时间作为字符串传递,以及表示该日期时间字符串模式的DateTimeFormatter。
//1 - 默认格式
String timeStamp = "2019-03-27T10:15:30";
ZonedDateTime localTimeObj = ZonedDateTime.parse(time);
//2 - 指定格式
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss a");
String timeStamp1 = "2019-03-27 10:15:30 AM";
ZonedDateTime localTimeObj1 = ZonedDateTime.parse(timeStamp1, formatter);

4.格式化ZonedDateTime

使用ZonedDateTime.format(formatter)方法将实例格式化为所需字符串模式。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss a");
ZonedDateTime now = ZonedDateTime.now();
String dateTimeString = now.format(formatter);    //2019-03-28 14:47:33 PM

5.向ZonedDateTime添加或减去时间

ZonedDateTime提供了以下方法进行修改。所有方法都返回ZonedDateTime的新实例,因为现有实例始终是不可变的。

  • plusYears()
  • plusMonths()
  • plusDays()
  • plusHours()
  • plusMinutes()
  • plusSeconds()
  • plusNanos()
  • minusYears()
  • minusMonths()
  • minusDays()
  • minusHours()
  • minusMinutes()
  • minusSeconds()
  • minusNanos()
ZonedDateTime now = ZonedDateTime.now();
//3 小时后
ZonedDateTime zonedDateTime1 = now.plusHours(3);
//3 分钟前
ZonedDateTime zonedDateTime2 = now.minusMinutes(3);
//明年同一时间
ZonedDateTime zonedDateTime2 = now.plusYears(1);
//去年同一时间
ZonedDateTime zonedDateTime2 = now.minusYears(1);

以上就是Java ZonedDateTime详解的全部内容。


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/back/10513.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】