介绍

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

时区在我们对时间的使用上扮演了非常重要的角色。但又因为时区的存在,又给我们带来了很多的麻烦,比如北美地区使用的夏令时和中国统一使用东 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 来显示当前的时间。

 
    @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

posted @ 2025-01-16 23:29 huyuchengus 阅读(19) 评论(0) 推荐(0) 编辑
摘要: 根据我们前面说的 Item 中的 Add Type 属性,这个主要用来标识输入的数据是不是随着时间的变化而变化,有下面 3 种选项。 No‐Add 这个就是当数据输入后,是不会再变化了,不会随着时间的变化而变化。 Response Each Time 这个就是每次在数据在创建的时候都有可能会变化。 阅读全文
posted @ 2024-03-28 09:33 huyuchengus 阅读(9) 评论(0) 推荐(0) 编辑
摘要: IRIS 的数据类型比较少,也就 4 个数据类型:字符串,数字,时间,分类。 在这里分类有点像我们的下拉选择框,其实对应 Java 或者其语言中的数据来说可以说是枚举类型。 只是 IRIS 的枚举类型是定义在数据库中的,并且是事先定义好的。 String 这个好说,就是字符串。 因为 M 语言的限制 阅读全文
posted @ 2024-03-28 09:25 huyuchengus 阅读(24) 评论(0) 推荐(0) 编辑
摘要: 对于我们用得最多的关系型数据库来说,首先有的是数据库名字,然后是表名字,然后就是字段名,随后就是一条一条的数据。 对于 IRIS 来说,因为是使用的层级数据库,所以上面的定义就不能完全的照搬了,而且不建议想象成一样,因为我们没有办法最后完全的对应上。 我们最好的是把 IRIS 想想成一个文件存储柜, 阅读全文
posted @ 2024-03-27 21:43 huyuchengus 阅读(44) 评论(0) 推荐(0) 编辑
摘要: 最近我们在想使用我们提供的代码库进行元数据提供的时候,启动的服务报 CORS 问题。 如果你的 Gitea 服务器是直接暴露给外部使用的话,可以在 Gitea 的配置文件中添加下面的配置: [cors] ENABLED = true ALLOW_DOMAIN = * 在完成上面的配置修改后,需要重启 阅读全文
posted @ 2024-03-27 03:19 huyuchengus 阅读(23) 评论(0) 推荐(0) 编辑
摘要: 我遇到了一个问题就是 Nginx 是作为反向代理服务器部署的,但因为 Nginx 的配置导致 CORS 问题。 在这个时候我们可以对 Nginx 的配置文件进行修改: 在 location 后添加下面的内容: add_header Access-Control-Allow-Origin *; add 阅读全文
posted @ 2024-03-27 03:11 huyuchengus 阅读(47) 评论(0) 推荐(0) 编辑
摘要: 在 Notepad++ 上,可以使用 ctrl 加上鼠标的左键来滚动来进行调整。 如何恢复默 可以使用 Ctrl 加数字键盘上的 / 键 来恢复默认设置。 当然也可以通过菜单栏上 view 菜单下的 Zoom 选项。 上面的界面中可以看到我们的在 Notepad++ 中使用的选项。 https:// 阅读全文
posted @ 2024-03-24 07:00 huyuchengus 阅读(54) 评论(0) 推荐(0) 编辑
摘要: FileZilla 有个默认设置是如果 20 秒没有数据的话会自动中断链接。 Command: Pass: **************** Error: Connection timed out after 20 seconds of inactivity Error: Could not con 阅读全文
posted @ 2024-03-24 03:08 huyuchengus 阅读(312) 评论(0) 推荐(0) 编辑
摘要: 可以理解的是 Chronicles 是 EPIC 公司根据 IRIS 进行魔改后的一个 DBMS。 简单的来说 Chronicles 就是一个数据库管理系统,但这个数据库管理系统不是我们常说的关系数据库的关联系统。 数据库结构 只要对数据库有所了解的都知道数据库通常就是 2 个部分,一个是存储,一个 阅读全文
posted @ 2024-03-22 02:15 huyuchengus 阅读(14) 评论(0) 推荐(0) 编辑
摘要: 我们都知道真正一个数据库通常是 2 个部分组成的,存储和进程。 Caché Caché 的定义就是一个数据库,在这个数据库中有存储和进程。 与我们常用的 MySQL 来说,我们安装好 MySQL 后我们就可以通过客户端进行连接了,同时我们还可以通过服务器上的字符界面来进行连接。 这里是一个完整的组件 阅读全文
posted @ 2024-03-21 12:13 huyuchengus 阅读(82) 评论(0) 推荐(0) 编辑
点击右上角即可分享
微信分享提示