两个不同时区之间的Joda时间UTC值不匹配

时间:2013-07-04 08:25:47

标签: java datetime jodatime

我知道有很多帖子与这个问题有关,但没有一个能够澄清我的疑问。

我需要以全局常量(UTC)毫秒值保存用户的DateTime值,这样它将有助于转换到不同的时区,因为我用两个不同的时区进行了一些测试,以下是我尝试的:

使用TimeZone - PDT(GMT - 7)

DateTime dateTime = new DateTime(2013, 07, 04, 1, 19, 22);
String format = "yyyy-MM-dd HH:mm:ss Z";

int offsetMinutes = (dateTime.getZone().getOffset(dateTime)/1000)/60;

log.info(" Current Timezone => "+dateTime.getZone()+", OffSet => "+offsetMinutes);
log.info(" dateTime => "+dateTime.toString(format)+" => "+dateTime.getMillis());

并使用相同的UTC日期时间

DateTime utcDateTime = dateTime.withZone(DateTimeZone.UTC);
offsetMinutes = (utcDateTime.getZone().getOffset(utcDateTime)/1000)/60;

log.info(" Current Timezone => "+utcDateTime.getZone()+", OffSet "+offsetMinutes);
log.info(" dateTime => "+utcDateTime.toString(format)+" => "+utcDateTime.getMillis());

以下是我得到的结果:

IN PDT(GMT - 7)

Current Timezone => America/Los_Angeles, OffSet => -420 (-7)
dateTime => 2013-07-04 01:19:22 -0700 => 1372925962000
Current Timezone => UTC, OffSet 0
dateTime => 2013-07-04 08:19:22 +0000 => 1372925962000

格林尼治标准时间+5:30

Current Timezone => Asia/Kolkata, OffSet => 330 (+5:30)
dateTime => 2013-07-04 01:19:22 +0530 => 1372880962000
Current Timezone => UTC, OffSet 0
dateTime => 2013-07-03 19:49:22 +0000 => 1372880962000

问题是,

  1. 使用PDT时区,为什么本地毫秒和UTC毫秒相同? (与IST时区相同)

  2. 为什么来自两个不同时区的UTC值不同?

  3. 如果utc应该是全局常量,那么两个不同时区的值应该相同吗?

    有人可以澄清我的疑问,我做错了吗?

    请提出任何建议或澄清是非常有帮助的

    由于 拉梅什

2 个答案:

答案 0 :(得分:4)

  

我需要以全局常量(UTC)毫秒值

保存用户的DateTime值

然后,您需要做的只是在使用正确的本地日期/时间和时区构建的getMillis()上调用DateTime。您根本不需要使用withZone。请注意,由于时区转换,某些本地日期/时间/区域组合可能不明确或被跳过。你应该考虑在这些情况下你想做什么。

  

使用PDT时区,为什么本地毫秒和UTC毫秒相同

因为你正在调用getMillis(),这是自unix时代以来的毫秒数。无论时区如何,它都是即时的全球代表。

  

为什么两个不同TimeZone的UTC值不同?

您已将当地时间保持不变,但更改了时区 - 这意味着您指的是不同的时刻。

答案 1 :(得分:0)

  

我需要以全局常量(UTC)毫秒值保存用户的DateTime值,以便它有助​​于转换为不同的时区

你如何准确存储?

正如测试代码的输出清楚地表明的那样,Just Just(tm)。 Unix纪元是从格林威治标准时间1970年1月1日开始的即时时间的表示(通常以秒为单位,但Java输出毫秒)。您可以使用它转换为任何时区。

但是,您最好的选择仍然是在用户输入时区时存储日期。这样你就可以进行任何你想要的计算。