gpt4 book ai didi

java - Joda-Time DateTime.toDate() 恢复时区

转载 作者:行者123 更新时间:2023-11-29 06:34:31 27 4
gpt4 key购买 nike

我正在尝试使用 Joda-Time 从一个时区转换为另一个时区.

final DateTimeZone fromTimeZone = DateTimeZone.forID("America/Los_Angeles");
final DateTimeZone toTimeZone = DateTimeZone.forID(toTimeZoneString);
DateTime convertedStart = new DateTime(start, fromTimeZone).withZone(toTimeZone);

Date finalS = convertedStart.toDate();

当我执行 .toDate() 时,我看到 finalS 丢失时区并恢复到原始时区。 convertedStart 已正确转换。

开始格式为 -> Wed Jun 04 18:15:38 GMT 2014


例子:

start: Wed Jun 04 18:15:38 GMT 2014
toTimeZoneString is Asia/Kolkata
convertedStart : 2014-06-05T06:45:38.409+05:30
finalS: Wed Jun 04 18:15:38 GMT 2014

为什么会这样?

最佳答案

由于您拒绝发布完整的工作代码示例,我将使用一个小演示作为答案。

使用 Joda-Time 2.3 的示例代码。

仅在强制时才使用 java.util.Date,例如其他类的输出/输入。

java.util.Date dateIn = new java.util.Date(); // Avoid java.util.Date when possible. 

将日期转换为 Joda-Time DateTime,并分配时区。我随意选择UTC .除非业务规则规定使用本地时区,否则您的大部分或所有业务逻辑都应在 UTC 中完成。

DateTime dateTimeUtc = new DateTime( dateIn, DateTimeZone.UTC ); // Convert Date to DateTime, assign UTC time zone.

将时区从UTC调整为美国西海岸。使用 proper time zone names (主要是大陆/城市或地区),而不是 3 或 4 个字母代码,既不标准化也不唯一。

DateTimeZone timeZoneLos_Angeles = DateTimeZone.forID( "America/Los_Angeles" ); // Adjust time zone to United States.
DateTime dateTimeLos_Angeles = dateTimeUtc.withZone( timeZoneLos_Angeles );

调整为印度时区,比 UTC 时间早五个半小时。请注意,对于 thread-safety Joda-Time 使用 immutable objects .我们不进行更改,而是创建一个新实例,同时从原始实例复制值。

DateTimeZone timeZoneKolkata = DateTimeZone.forID( "Asia/Kolkata" ); // Adjust time zone to India.
DateTime dateTimeKolkata = dateTimeLos_Angeles.withZone( timeZoneKolkata );

如果需要,转换回 j.u.Date。

java.util.Date dateOut = dateTimeKolkata.toDate();

转储到控制台。请注意,默认情况下,Joda-Time 根据 ISO 8601 standard 创建字符串表示。 .

System.out.println( "dateIn: " + dateIn ); // j.u.Date's "toString" method applies JVM's default time zone. Very confusing, as a j.u.Date has no time zone.
System.out.println( "dateTimeUtc: " + dateTimeUtc );
System.out.println( "dateTimeLos_Angeles: " + dateTimeLos_Angeles );
System.out.println( "dateTimeKolkata: " + dateTimeKolkata );
System.out.println( "dateOut: " + dateOut ); // j.u.Date's "toString" method uses a terrible format. Use only in a pinch like debugging, never in production.
System.out.println( "Milliseconds since Unix epoch: " + dateIn.getTime() + " | " + dateTimeUtc.getMillis() + " | " + dateTimeLos_Angeles.getMillis() + " | " + dateTimeKolkata.getMillis() + " | " + dateOut.getTime() );

运行时...

dateIn: Wed Jun 04 13:51:01 PDT 2014
dateTimeUtc: 2014-06-04T20:51:01.593Z
dateTimeLos_Angeles: 2014-06-04T13:51:01.593-07:00
dateTimeKolkata: 2014-06-05T02:21:01.593+05:30
dateOut: Wed Jun 04 13:51:01 PDT 2014
Milliseconds since Unix epoch: 1401915061593 | 1401915061593 | 1401915061593 | 1401915061593 | 1401915061593

了解所有这些日期时间值代表同一时刻,即宇宙时间轴上的同一点。请注意字符串在不同日期(6 月 4 日和 5 日)之间的变化,但我们看到的是同一时刻。想象一下,雷克雅未克、洛杉矶和加尔各答的三个人同时在看他们的怀表/手机 (wall-clock time)。

关于java - Joda-Time DateTime.toDate() 恢复时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24044810/

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