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使用详解_第1张图片使用

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

从指定时区获取系统时间,返回对象
OffsetDateTime使用详解_第2张图片参数需要传入一个时区id,这个ZoneId 到底是什么?有哪些时区id?
打印可用的时区id

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

可以看到可用时区数量:599
OffsetDateTime使用详解_第3张图片

使用

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

从指定时钟获取对象
OffsetDateTime使用详解_第4张图片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)

指定日期、时间、和偏移量
OffsetDateTime使用详解_第5张图片使用ZoneOffset.of设置偏移量范围 -18::00 ~ +18:00
使用ZoneOffset.UTC设置的偏移量为0
OffsetDateTime使用详解_第6张图片使用

        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 :瞬间
OffsetDateTime使用详解_第7张图片看一下Instant 是什么鬼东西
OffsetDateTime使用详解_第8张图片使用

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 中,这个方法只是把值取出来,通过其他静态方法返回对象
OffsetDateTime使用详解_第9张图片看一下TemporalAccessor是什么
这是一个接口,框架级接口定义对时间对象的只读访问, 例如日期、时间、偏移或这些的某种组合;
应用程序应该创建并通过 围绕具体类型的实例,例如LocalDate。
OffsetDateTime使用详解_第10张图片

OffsetDateTime使用详解_第11张图片
使用

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

传入字符串解析为对象,可以看到这个方法对时间格式有很高的要求
OffsetDateTime使用详解_第12张图片使用

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

这个方法相比上一个方法可以自己传入时间格式。
OffsetDateTime使用详解_第13张图片使用

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

org.threeten.bp包

你可能感兴趣的:(java,开发语言)