gpt4 book ai didi

Java - Calendar.set(HOUR_OF_DAY) 出现意外结果

转载 作者:行者123 更新时间:2023-12-01 07:47:45 27 4
gpt4 key购买 nike

JVM 版本为 1.7。时区为 GMT+3,偏移 180 分钟。 1500411600000对应7/19/2017, 12:00:00 AM (我已经验证了这个 online )。

我正在执行以下代码来调整 Date 的时间实例:

final Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
Date date = new Date(1500411600000L);
calendar.setTime(date);
calendar.set(Calendar.HOUR_OF_DAY, 23);
calendar.set(Calendar.MINUTE, 59);
calendar.set(Calendar.SECOND, 59);
calendar.set(Calendar.MILLISECOND, 999);
date = calendar.getTime();

我预计date成为7/19/2017, 11:59:59 PM但我得到的不是这个 7/19/2017, 2:59:59 AM 。 3 小时的差异 - 与我的时区与 UTC/GMT 的差异一样多,所以我认为这里发生了一些未被注意到的转换。

debug - date evaluation

您能帮我找到与时区无关的代码来调整日期时间吗?

最佳答案

您是正确的,在 UTC+3 偏移处,您的毫秒值 1500411600000 对应于 2017 年 7 月 19 日午夜(一天的开始)。在其他偏移量下,它对应于一天中的其他时间,即 7 月 18 日或 19 日。

java.time

假设您所在时区的午夜并非巧合,并且该值实际上应该代表日期,而不是时间,我建议您使用 LocalDate来自java.time来代表它:

    ZoneId yourTimeZone = ZoneId.of("Europe/Riga");
LocalDate date = Instant.ofEpochMilli(1500411600000L)
.atZone(yourTimeZone)
.toLocalDate();
System.out.println(date);

这将打印预期的内容

2017-07-19

如果您的时区不是欧洲/里加,请替换为正确的时区,或者使用 ZoneOffset相反:.atOffset(ZoneOffset.ofHoursMinutes(3, 0)) (其他行相同)。

我怀疑你并不真正想要这一天的结束,尽管在你的问题中你试图设定它。如果这是为了确定某个时间点是否在当天结束之前,请将其与第二天的开始进行比较,并要求严格在之前。这为您省去了看起来奇怪的分钟、秒和秒的几分之一的麻烦。

    ZonedDateTime startOfNextDay = date.plusDays(1).atStartOfDay(yourTimeZone);

java.time它于 2014 年问世,作为 Java 1.0 和 1.1 中设计不佳的日期和时间类以及 Joda-Time 的替代品,从中汲取了很多灵感。我强烈推荐您使用它。

您在问题中尝试了什么

我相信用 java.time 表达时,问题中的代码也更清晰:

    OffsetDateTime endOfDay = Instant.ofEpochMilli(1500411600000L)
.atOffset(ZoneOffset.UTC)
.with(LocalTime.MAX);
System.out.println(endOfDay);

这会打印

2017-07-18T23:59:59.999999999Z

(UTC 时间为 7 月 18 日结束时;末尾的 Z 表示 UTC)。除了小数位数之外,这也是您得到的结果。您可能被您的Date这一事实所愚弄。实例打印类似 Wed Jul 19 02:59:59 EEST 2017 (时区缩写取决于 JVM 的时区设置)。 Date.toString()获取 JVM 的时区设置,并将日期时间转换为该时区,仅用于生成的字符串; Date实例本身没有被修改,只保存时间线上的一个点,没有时区。

问题:我可以使用 java.time我的 Java 版本?

是的,你可以。您只需要至少使用 Java 6

学习使用java.time ,参见the Oracle tutorial或者在网上查找其他资源。

关于Java - Calendar.set(HOUR_OF_DAY) 出现意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47867821/

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