章
目
录
了解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详解的全部内容。