gpt4 book ai didi

java - 确定夏令时的小时数

转载 作者:行者123 更新时间:2023-11-29 08:40:48 24 4
gpt4 key购买 nike

可能这个问题被问过很多次,但我可能找不到正确的关键字来找到它们。

30:10 有时间变更。时间在 03:00 调回 2 点(欧洲/柏林)。也就是说,当天有两个02:00(时间变更前后)

目前,我有两个日期 (java.util.Date) 对象。其中一个创建于第一个 02:00 点(在时间调回之前),第二个创建于第二个 02:00 点。

有什么方法可以根据创建时间是第一点还是第二点 02:00 来区分这些对象?

最佳答案

从纪元开始计数

您的 java.util.Date 对象实际上 UTC,但它们的 toString 方法在生成字符串输出时混淆地应用了时区。

您可以通过从 epoch 询问它们的计数来区分两个 Date 对象。在内部,日期时间被跟踪为自 UTC 1970 年第一时刻以来的毫秒数。调用错误命名的方法 java.util.Date::getTime 以获取 long

世界标准时间

UTC 中记录时刻。每个程序员都应该学会在 UTC 中思考,在 UTC 中工作,在 UTC 中登录,并在他们的 table 和屏幕上保持第二个时钟设置为 UTC。

UTC 是唯一真实时间。所有其他的都只是变体,每个时区都与 UTC 有偏差。

为了清楚起见,让我再重复一遍这个首字母缩略词:UTC

即时

Instant 类(class)是您在这个领域最好的新 friend ,是您进行约会工作的首选类(class)。它代表 UTC 时间轴上的一个时刻,精度为纳秒。

Instant instant = Instant.now() ;

您不必担心夏令时 (DST) 的切换、政治家重新定义 DST(通常几乎没有通知),也不必担心任何一个时区特有的其他异常情况。只需使用 UTC。

要生成代表这一刻的字符串,请为标准 ISO 8601 格式的字符串调用 toString。此字符串始终采用 UTC,因此您不会遇到 Date::toString 在生成字符串时应用时区的问题。标准格式的末尾有一个 ZZulu 的缩写,表示 UTC。

instant.toString():
2016-01-23T12:34:56.123456789Z

转换日期

将您的 java.util.Date 对象转换为 Instant。新的转换方法已添加到旧类中。

Instant instant = myUtilDate.toInstant();

分区

我不关心柏林时间。作为程序员,您不关心柏林时间。您的网络和服务器管理员不关心柏林时间。我们关心 UTC。

唯一关心柏林时间的人是最终用户。您可以为他们分配一个时区来呈现数据。

ZoneId z = ZoneId.of( "Europe/Berlin" );
ZonedDateTime zdt = instant.atZone( z );

调用 toString 生成标准 ISO 8601 格式的字符串,但通过在方括号中附加时区名称来明智地扩展。

2016-07-07T08:00:15.768+02:00[Europe/Berlin]

使用 DateTimeFormatter 类生成表示其他格式的日期时间值的字符串。

夏令时生效了吗?

您可以询问以确定夏令时 (DST) 是否对任何特定的 ZonedDateTime 有效。参见 this Question

ZoneRules rules = zdt.getZone().getRules();
Boolean dstInEffect = rules.isDaylightSavings( zdt.toInstant() );

关于java - 确定夏令时的小时数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40380974/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com