OffsetDateTime使用详解

OffsetDateTime使用

java.time.OffsetDateTime

构造器

话不多说直接看源码
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");
    }

静态方法

now()

使用系统默认的时钟获取时间和时区返回对象
在这里插入图片描述使用

OffsetDateTime now = OffsetDateTime.now();
now(ZoneId zone)

从指定时区获取系统时间,返回对象
在这里插入图片描述参数需要传入一个时区id,这个ZoneId 到底是什么?有哪些时区id?
打印可用的时区id

        Set<String> availableZoneIds = ZoneId.getAvailableZoneIds();
        System.out.println("可用时区数量:" + availableZoneIds.size());
        availableZoneIds.forEach(ZoneId -> System.out.println(ZoneId));

可以看到可用时区数量:599
在这里插入图片描述

使用

ZoneId zoneId = ZoneId.of("Asia/Aden");
        OffsetDateTime now = OffsetDateTime.now(zoneId);
now(Clock clock)

从指定时钟获取对象
在这里插入图片描述Clock和ZoneId一样包含时区id
使用

        ZoneId zoneId = ZoneId.of("Asia/Aden");
        Clock colck01 = Clock.system(zoneId);
        Clock clock02 = Clock.systemDefaultZone();
        OffsetDateTime now = OffsetDateTime.now(clock02);
of(LocalDate, LocalTime, ZoneOffset)

指定日期、时间、和偏移量
在这里插入图片描述使用ZoneOffset.of设置偏移量范围 -18::00 ~ +18:00
使用ZoneOffset.UTC设置的偏移量为0
ZoneOffset.of使用

        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和上面差不多,只是设置时间的方式不一样罢了,我只写一些有意义的展示。

ofInstant(Instant , ZoneId )

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);

结果和上面一样

from(TemporalAccessor)

TemporalAccessor :临时访问器
日期、时间和偏移量都封装在TemporalAccessor 中,这个方法只是把值取出来,通过其他静态方法返回对象
在这里插入图片描述看一下TemporalAccessor是什么
这是一个接口,框架级接口定义对时间对象的只读访问, 例如日期、时间、偏移或这些的某种组合;
应用程序应该创建并通过 围绕具体类型的实例,例如LocalDate。
在这里插入图片描述

在这里插入图片描述
使用

 ZonedDateTime now = ZonedDateTime.now();
 OffsetDateTime offsetDateTime = OffsetDateTime.from(now);
parse(CharSequence text)

传入字符串解析为对象,可以看到这个方法对时间格式有很高的要求
在这里插入图片描述使用

        String time = "2022-12-03T10:15:30+08:00";
        OffsetDateTime offsetDateTime = OffsetDateTime.parse(time);
     
parse(CharSequence, DateTimeFormatter)

这个方法相比上一个方法可以自己传入时间格式。
在这里插入图片描述使用

        DateTimeFormatter isoOffsetDateTime = DateTimeFormatter.ISO_OFFSET_DATE_TIME;
        OffsetDateTime offsetDateTime = OffsetDateTime.parse(time, isoOffsetDateTime);

org.threeten.bp包

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值