首页 > 编程语言 >Java 中的 ZoneOffset

Java 中的 ZoneOffset

时间:2025-01-16 23:32:15浏览次数:1  
标签:00 Java ZoneId ZoneOffset 时间 ZonedDateTime

介绍

在我们的这个世界上因为地球是圆的,所以每个国家都会有自己特定的时区。

时区在我们对时间的使用上扮演了非常重要的角色。但又因为时区的存在,又给我们带来了很多的麻烦,比如北美地区使用的夏令时和中国统一使用东 8 区的时间等。

 

2025-01-16_10-24-57

 

当这些时间在我们计算机中进行体现的时候就会给我们带来不少的麻烦,为了解决这些麻烦,Java 提供了一些 API 来进行处理,比如用到的 DateTimeDateTime

我们都知道,Java 的时间处理因为 API 的使用会变得非常的繁琐,所以在新的版本 Java 中,Java 尝试解决这个问题,为此开始提供 ZoneIdZoneOffset API 来管理时区。

在本文中,我们将会对 ZoneIdZoneOffset 进行一些探讨,同时也对 DateTime 类进行一些探索。

ZoneIdZoneOffset

JSR-310 发布的版本中,Java 添加了一些 API 用来管理日期,时间和有时区的时间。

ZoneIdZoneOffset 类做为上面更新的一部分也同时添加到了 Java 中。

ZoneId

*ZoneId 在 Java 中被用来表示时区,例如 ‘Europe/Paris‘.

针对 ZoneId 有 2 个实现,第一个实现是针对 GMT/UTC 来计算偏移量。

第二个实现为使用距离的地理区域,这会针对 GMT/UTC 对比来进行一系列的计算。

让我们来创建一个 Berlin, Germany 的 ZoneId 实例。

 
ZoneId zone = ZoneId.of("Europe/Berlin");

针对中国可以使用的时间定义为标准北京时间。

 
        ZoneId zoneId = ZoneId.of("Asia/Shanghai");

但使用的时间字符串为上海。

ZoneOffset

ZoneOffset 集成了 ZoneId 同时来定义了当前使用的时区针对 GMT/UTC 的偏移量,例如:+02:00。

这就意味这个这个数字表示的是针对 UTC 标准时间使用的固定小时和分钟数。

 
        LocalDateTime now = LocalDateTime.now();
        ZoneId zone = ZoneId.of("Asia/Shanghai");
        ZoneOffset zoneOffSet = zone.getRules().getOffset(now);
        logger.debug("zoneOffSet: {}", zoneOffSet);

上面代码的输出为:

 
09:13:25.045 [main] DEBUG com.ossez.datetime.DateTimeZoneUnitTest - zoneOffSet: +08:00

因为北京使用的是东八区的时间。

针对同一个国家可能有 2 个针对 UTC 时间的偏移量——这些国家主要是使用夏令时的国家。比如说美国就是一个使用夏令时的国家。

因此,针对这些国家 ZoneOffset 就会有 2 个实现了,具体需要参考 LocalDateTime* API 中的实现。

DateTime 类

下一个,让我们来讨论下 DateTime 类,这个类实际上将会使用 ZoneIdZoneOffset

ZonedDateTime

ZonedDateTime 是不可变(immutable )的实现,这个用来输出一个基于 ISO-8601 表达方式的时间。

例如: 2007-12-03T10:15:30+01:00 Europe/Pari

一个 ZonedDateTime 将会表达有 3 个部分,分别为LocalDateTimeZoneIdZoneOffset

这个类将会保存有所有的日期和时间字段来精确的表达时间,时区和时区偏移量。

我们用这个来处理模糊的本地时间。

例如:, ZonedDateTime 可以保存值 “2nd October 2007 at 13:45.30.123456789 +02:00 in the Europe/Paris time-zone”。

让我们使用 ZonedDateTime 来显示当前的时间。

 
    @Test
    public void ZonedDateTime_out() {
        ZoneId zone = ZoneId.of("Asia/Shanghai");
        ZonedDateTime date = ZonedDateTime.now(zone);
        logger.debug("date: {}", date);
    }

上面程序的输出为:

 
09:32:04.549 [main] DEBUG com.ossez.datetime.DateTimeZoneUnitTest - date: 2025-01-16T22:32:04.547368100+08:00[Asia/Shanghai]

从实例化的输出来看,保留了非常多的时间信息。

我的计算机是现在东部时间,可以看到获得的实例已经转换成了北京时间。

ZonedDateTime 同时还提供了内置函数来从一个时区转换为另外的一个时区。

 
ZonedDateTime destDate = sourceDate.withZoneSameInstant(destZoneId);

OffsetDateTime

OffsetDateTime 是不可变的的一个日期时间,这个日期时间使用的是针对 UTC 的偏移量来进行保存的,同样使用 ISO-8601 格式。

例如:2007-12-03T10:15:30+01:00.

这个类将会保存有所有的日期和时间字段来精确的表达时间,时区和时区偏移量。

例如:OffsetDateTime 可以寸尺值 “2nd October 2007 at 13:45.30.123456789 +02:00”。

让我们来获得针对 GMT/UTC 2 小时偏移量的 OffsetDateTime

 
ZoneOffset zoneOffSet= ZoneOffset.of("+02:00");
OffsetDateTime date = OffsetDateTime.now(zoneOffSet);

OffsetTime

OffsetTime 是不可变的的一个时间。

通常这个时间使用 hour-minute-second-offset 来进行表达,在 ISO-8601 日历系统中将会输出为:: 10:15:30+01:00

这个类只会存储时间,不会对日期进行存储。

可以使用 “13:45.30.123456789+02:00” 来对其初始化。

让我们来获得 OffsetTime 2 个时区的偏离量:

 
ZoneOffset zoneOffSet = ZoneOffset.of("+02:00");
OffsetTime time = OffsetTime.now(zoneOffSet);

结论

ZoneOffset 通常用来处理针对 GMT/UTC 不同时区的偏移量。

同时 ZoneIdZoneOffset 不会单独使用,通常会结合 DateTime 的时间类来使用。

例如 Java 中使用的 ZonedDateTime, OffsetDateTime, 和 OffsetTime

 

https://www.isharkfly.com/t/java-zoneoffset/16803

标签:00,Java,ZoneId,ZoneOffset,时间,ZonedDateTime
From: https://www.cnblogs.com/huyuchengus/p/18675925

相关文章

  • 学习疯狂JAVA讲义1.16
    练习结果:(如有更好方法,敬请指点)这两天沉迷刘晓庆自传—《人生不怕从头再来》,光看前言就入坑了,这女人身上的魅力是无与伦比的,她的经历是文坛作家们绞尽脑汁,想到死,想到吐血都编撰不出来的,既刺激又真实,让人不舍得睡醒再读,吸引着我必须当天读完!        金句摘抄如......
  • [2025.1.16 JavaSE学习]线程常用方法
    线程常用方法setName:设置线程名称getName:返回线程名称start:使线程开始执行,JVM底层调用该线程的start0()方法run:调用线程对象run方法setPriority:更改线程优先级,三个级别:getPriority:获取线程优先级sleep:线程休眠interrupt:中断线程,但并没有真正地结束线程(不是终止,是中断),......
  • Java中的依赖注入是什么?它如何工作?
    目录什么是依赖注入依赖注入的工作原理使用场景总结在Java开发中,依赖注入(DependencyInjection,DI)是一种重要的设计模式,它能够有效地减少代码之间的耦合度,提高代码的可测试性、可维护性和扩展性。以下是对Java中的依赖注入及其工作原理和使用场景的详细解释,并结合具......
  • Java集合常见面试题大全
    目录一、集合概述1.1 Java集合概览1.2 说说List,Set,Queue,Map四者的区别?1.3  集合框架底层数据结构总结1.4 如何选用集合?1.5 为什么要使用集合?二、Collection子接口之List2.1 Arraylist和Vector的区别?2.2 Arraylist与LinkedList区别?......
  • JavaDay6
    JavaDay6多线程单线程:一个程序能够使用一条执行路径,从开始到结束。而多线程则为——一个进程有多条执行路径多线程的创建1、自己造一个类,继承Thread类,重写run()方法,创建该线程类的对象【线程对象】,启动start()/*1、自己造一个类,继承Thread类,重写run方法,创建该线程类......
  • Java选择结构(switch)
    switch多选择结构>多选择结构还有一个实现方法就是switchcase语句>switchcase语句判断一个变量与一系列值中某个值是否相等每个值称为一个分支>switch语句中的变量类型可以是:byte,short,int,char从JavaSE7开始switch支持字符串String类型了同时case标签必须为字符......
  • Vue 开发者必备的 JavaScript 基础知识
    变量与数据类型为什么重要:Vue3的响应式系统严重依赖于正确的变量声明。组合式API要求理解 const 用于ref和reactive对象。类型意识有助于Vue3的模板渲染和prop验证。const count= ref(0)const user= reactive({  name: 'John',  age: 30......
  • 【附源码】JAVA进销存系统源码+SpringBoot+VUE+前后端分离
    学弟,学妹好,我是爱学习的学姐,今天带来一款优秀的项目:进销存系统 。本文介绍了系统功能与部署安装步骤,如果您有任何问题,也请联系学姐,偶现在是经验丰富的程序员!一.系统演示系统测试截图    系统视频演示 https://githubs.xyz/show/344.mp4 二.系统概述 【......
  • 毕设学习第四天之Java的注解和反射
    注解(Annotation)Java注解(Annotation)是一种特殊的语言构造,用于为代码元素(如类、方法、字段等)提供元数据,通常不直接影响程序的逻辑执行。它们可以被编译器、框架或工具解析,用于执行特定操作,如自动化配置、代码生成、验证等。Java提供了内置的注解(如@Override、@Deprecated)和允......
  • java-面试实战总结-2025-01-16
     下午接到hr电话,说是想约晚上7点的线上面试,感觉准备时间有点来不及了,我就跟hr沟通把时间改到了8点,多腾出来点时间进行复习。  招聘信息强调了要求会微服务,我这边微服务用的少,到家后就着重复习了微服务相关的知识。面试过程大概有半个小时,面试流程如下:1、开始后进行自我......