Java 中的 ZoneOffset

news/2025/1/16 23:31:22/文章来源:https://www.cnblogs.com/huyuchengus/p/18675925

介绍

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

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

 

 

当这些时间在我们计算机中进行体现的时候就会给我们带来不少的麻烦,为了解决这些麻烦,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 来显示当前的时间。

 
    @Testpublic 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/870346.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

转:gunicorn相关配置

转自:https://blog.csdn.net/xu710263124/article/details/118975404一、gunicorn的简介Gunicorn是基于unix系统,被广泛应用的高性能的Python WSGI HTTP Server。用来解析HTTP请求的网关服务。它通常是在进行反向代理(如nginx),或者进行负载均衡(如 AWS ELB)和一个web 应…

Microsoft Office 2024 下载安装教程 ,超详细教程(建议新手收藏)

大家好,我是你们的效率小专家!今天给大家带来一篇非常实用的教程——**如何安装 Microsoft Office 2024 Professional Plus**!这款软件升级不仅让我们平时常用的 Word、Excel、PowerPoint 等工具变得更加强大,还新增了很多酷炫的功能,比如数据分析、动画创作、音视频编辑等…

2025年员工绩效考核指南

为什么要进行年度绩效评估? 评估用于形式化和记录员工与其工作期望相比的工作方式。这样,可以增强或指出性能需要更改或改进。此正式评估支持薪酬决定或人员行动,例如重新分类,永久性额外关税和纠正措施。 谁需要接受评估? 作为最佳实践,任何定期工作且处于预期继续职位的…

.NET 项目如何管理资源及配置文件

.NET/WPF 项目如何管理资源及配置文件.NET项目如何管理资源及配置文件_哔哩哔哩 .NET 项目的资源及配置文件(视频中的思维导图)本文为以上视频的笔记🍉 生成操作 Build actions for files - Visual Studio (Windows) | Microsoft Learn复制到输出目录 这个是跟生成操作独立…

实战分享:如何为企业量身打造AI助理

在当今这个数字化时代,AI技术正以前所未有的速度改变着企业的运营模式。AI助理,作为连接人与技术的桥梁,正逐渐成为企业提升效率、优化决策的重要工具。然而,如何为企业量身打造一款既高效又贴合需求的AI助理,却是许多企业面临的难题。本文将结合实战经验,分享构建企业专…

常用类学习

Java常有类:Object常有方法如getClass(),hashMap(),toString(),equals(),finalize()方法。和包装类等学习视频 object类超类、基类,所有类的直接或间接父类,位于继承树的最顶层。 任何类,如没有书写extends显示继承某个类,都默认直接继承object类否则为间接继承。 obj…

webpack5 从零搭建 vue3 项目

目前 vue3 官网推荐的工具链已经是 vite 了,就算是要使用 webpack 甚至是 webpack5,也可以直接使用 vue-cli。然而之所以写这个,可以当是 webpack5 的一个学习文章。同时也是因为之前有个项目是在 vue3 刚出来的时候使用 vue-cli (那是官网还是推荐使用 webpack,以及但是得…

2025-1-12至16-uniapp初体验

2025-1-12 今天主要就是在熟悉app开发软件应用,发现它的页面开发起来跟我们的web是一样的,初始界面就跟VScode操作一样,毕竟第一步是要做页面,然后它的控制台跟tomcat集成之后使用很像,之后就是复习一下web的css。盒子模型:margin:外边距 控制边框离屏幕的距离(top 上…

谷歌60s视频生成模型Veo的技术亮点

谷歌60s视频生成模型Veo的技术亮点如下: 高分辨率长视频生成 高分辨率输出:能够生成高质量的10谷歌60s视频生成模型Veo的技术亮点如下: 高分辨率长视频生成高分辨率输出:能够生成高质量的1080p分辨率视频,可满足长视频内容制作需求,如用于电影、广告等对画质要求较高的场…

【夸克网盘福利】如何领取1TB免费空间?小白三分钟学会!

Hello 大家好!我是你们的网盘省钱达人,今天给大家带来一个超实用的小技巧——**如何用夸克网盘免费领取1TB的存储空间**!没错,不用花一分钱,就能获得超大容量,随便存视频、照片、大文件,彻底告别“存储焦虑”。教程全程亲测有效,小白也能三分钟学会!废话不多说,快跟着…