gpt4 book ai didi

java - 日历在错误的时区返回日期

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:08:28 25 4
gpt4 key购买 nike

如果我在 GMT 时区的计算机上执行以下命令

TimeZone timeZone = TimeZone.getTimeZone('IST');  // India Standard Time
Calendar calendar = Calendar.getInstance(timeZone);

System.out.println(calendar.getTime());

打印

Fri Oct 31 15:18:22 GMT 2014

为什么日期打印在计算机的默认时区中,而不是 Calendar 构造时使用的 TimeZone

最佳答案

Answer by Joshi正确但简短。我会稍微扩展一下,并展示现代类(class)的替代方案。

日期没有时区

您的代码 calendar.getTime()java.util.Calendar 对象中提取一个 java.util.Date 对象。

java.util.Date 类有一个用意良好但令人困惑的特性,它的 toString方法在生成字符串时应用 JVM 当前的默认时区。这会造成一种错觉,即 Date 类有一个时区,而实际上它没有。 Date 表示时间轴上的一个时刻,表示自 1970 年 UTC(1970-01-01T00:00:00Z)的纪元引用日期以来的毫秒数。 (更令人困惑的是,Date 类实际上确实在内部深处有一个时区,但无法访问且与此讨论无关。)

避免遗留日期时间类

旧的日期时间类现在是遗留的,被 java.time 类所取代。而是仅使用 java.time 类。

即时

暂时在 UTC 中,相当于 java.util.Date,使用 Instant 类。 Instant class 代表时间轴上的一个时刻 UTC分辨率为 nanoseconds (最多九 (9) 位小数)。

Instant instant = Instant.now();  // Current moment in UTC.

ZonedDateTime

通过特定区域的镜头查看同一时刻 wall-clock time , 应用 ZoneId 以获得 ZonedDateTime

指定 proper time zone name格式为continent/region,如America/Montreal , Africa/Casablanca ,或 太平洋/奥克兰。切勿使用 3-4 个字母的缩写,例如 ESTIST,因为它们不是真正的时区,不是标准化的,甚至不是唯一的( !)。

ZoneId z = ZoneId.of( "Asia/Kolkata" );
ZonedDateTime zdt = instant.atZone( z );

在 Stack Overflow 中搜索有关此主题的许多其他问题和答案。这个问题实际上是许多其他问题的重复。


关于java.time

java.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧类 legacy日期时间类,例如 java.util.Date , Calendar , & SimpleDateFormat .

Joda-Time项目,现在在maintenance mode , 建议迁移到 java.time类。

要了解更多信息,请参阅 Oracle Tutorial .并在 Stack Overflow 中搜索许多示例和解释。规范为 JSR 310 .

从哪里获得 java.time 类?

ThreeTen-Extra项目用附加类扩展 java.time。该项目是 future 可能添加到 java.time 的试验场。您可能会在这里找到一些有用的类,例如 Interval , YearWeek , YearQuarter , 和 more .

关于java - 日历在错误的时区返回日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26678030/

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