话不多说直接看源码
OffsetDateTime构造器,是一个私有的方法,通过构造器可以看出OffsetDateTime对象是由两部分组成:1、LocalDateTime 2、ZoneOffset
也就是时间和时区偏移量两部分组成,也说明不能通过new创建
private OffsetDateTime(LocalDateTime dateTime, ZoneOffset offset) {
this.dateTime = Objects.requireNonNull(dateTime, "dateTime");
this.offset = Objects.requireNonNull(offset, "offset");
}
OffsetDateTime now = OffsetDateTime.now();
从指定时区获取系统时间,返回对象
参数需要传入一个时区id,这个ZoneId 到底是什么?有哪些时区id?
打印可用的时区id
Set<String> availableZoneIds = ZoneId.getAvailableZoneIds();
System.out.println("可用时区数量:" + availableZoneIds.size());
availableZoneIds.forEach(ZoneId -> System.out.println(ZoneId));
使用
ZoneId zoneId = ZoneId.of("Asia/Aden");
OffsetDateTime now = OffsetDateTime.now(zoneId);
从指定时钟获取对象
Clock和ZoneId一样包含时区id
使用
ZoneId zoneId = ZoneId.of("Asia/Aden");
Clock colck01 = Clock.system(zoneId);
Clock clock02 = Clock.systemDefaultZone();
OffsetDateTime now = OffsetDateTime.now(clock02);
指定日期、时间、和偏移量
使用ZoneOffset.of设置偏移量范围 -18::00 ~ +18:00
使用ZoneOffset.UTC设置的偏移量为0
使用
LocalDate localDate = LocalDate.now();
LocalTime localTime = LocalTime.now();
ZoneOffset zoneOffset01 = ZoneOffset.UTC; //2022-11-29T22:27:33.682Z
ZoneOffset zoneOffset02 = ZoneOffset.of("+08:00"); //2022-11-29T22:27:00.346Z
OffsetDateTime offsetDateTime = OffsetDateTime.of(localDate, localTime, zoneOffset02);
偏移量多少,只是把Z替换成偏移量
2022-11-29T22:37:18.785Z
2022-11-29T22:36:11.855+08:00
下面有些api和上面差不多,只是设置时间的方式不一样罢了,我只写一些有意义的展示。
Instant :瞬间
看一下Instant 是什么鬼东西
使用
Instant instant01 = Instant.now();
ZoneId zoneId = ZoneId.systemDefault();
OffsetDateTime offsetDateTime = OffsetDateTime.ofInstant(instant01, zoneId);
结果是:2022-11-29T22:45:01.328+08:00
通过Instant.now()的偏移量是+08:00,东八区。
也可以通过自己指定Clock
Clock clock = Clock.systemDefaultZone();
Instant instant02 = Instant.now(clock);
ZoneId zoneId = ZoneId.systemDefault();
OffsetDateTime offsetDateTime = OffsetDateTime.ofInstant(instant02, zoneId);
结果和上面一样
TemporalAccessor :临时访问器
日期、时间和偏移量都封装在TemporalAccessor 中,这个方法只是把值取出来,通过其他静态方法返回对象
看一下TemporalAccessor是什么
这是一个接口,框架级接口定义对时间对象的只读访问, 例如日期、时间、偏移或这些的某种组合;
应用程序应该创建并通过 围绕具体类型的实例,例如LocalDate。
ZonedDateTime now = ZonedDateTime.now();
OffsetDateTime offsetDateTime = OffsetDateTime.from(now);
传入字符串解析为对象,可以看到这个方法对时间格式有很高的要求
使用
String time = "2022-12-03T10:15:30+08:00";
OffsetDateTime offsetDateTime = OffsetDateTime.parse(time);
DateTimeFormatter isoOffsetDateTime = DateTimeFormatter.ISO_OFFSET_DATE_TIME;
OffsetDateTime offsetDateTime = OffsetDateTime.parse(time, isoOffsetDateTime);