【问题标题】:Calculate hours difference with another timezone计算与另一个时区的小时差
【发布时间】:2016-03-06 17:36:59
【问题描述】:

如果我有一个时区,例如“GMT-05:00”
如何使用 Joda 找到与我当前位置的时间差?
我正在使用此代码:

TimeZone tz = TimeZone.getTimeZone("GMT" + gmtTZ);
    
int offset = tz.getOffset((new DateTime().getMillis()));
    
System.out.println(“— > “+offset / 3600000d);
    

给我-5,但它没有考虑到我的时区的时差。

【问题讨论】:

  • 对不起,也许我只是误会了,但是-5是怎么出乎意料的呢?
  • 获取您的本地时区 (TimeZone.getDefault()),进行相同的计算,然后减去两者如何?
  • @MrHug:不,因为我提前 7 小时
  • @AndyTurner:我用这种方法得 0
  • @Jim 你确定你的JVM的默认时区设置正确吗?

标签: java jodatime


【解决方案1】:

阅读getOffset方法的文档。 Millis from date 不包含有关时区的任何信息,getOffset 采用millis 参数来判断此特定日期是否在夏令时内。如果是这样,您将多获得一小时。你这样做的方式永远不会有什么不同,你的结果只能是-5/-4小时。

你甚至不需要 JodaTime:

TimeZone timezone = TimeZone.getTimeZone("GMT-5");
TimeZone localTimeZone = TimeZone.getDefault();

int timeZoneOffset = timezone.getOffset(System.currentTimeMillis());
int localTimeZoneOffset = localTimeZone.getOffset(System.currentTimeMillis());

int difference = Math.abs(timeZoneOffset - localTimeZoneOffset ) / 3600000;

如果您想要 JodaTime,只需将 System.currentTimeMillis() 替换为 DateTime.now().getMillis(),但除了可测试性之外,我没有看到其他意义。

【讨论】:

  • 最好获取一次当前时间(通过任一方法)并在两次调用 getOffset 时使用。差异很小,但更正确。
  • 也许是蹩脚的问题,但为什么 TimeZone.getDefault(); 会返回 GMT 的默认时区,而不是例如在UTC?
  • 我从未写过TimeZone.getDefault() 将返回格林威治标准时间。阅读 javadoc。通常它会返回您机器的时区,但并非总是如此 -> 阅读 javadoc
  • 所以基本上我不应该关心这个计算是否在不同的时区之间?例如。 “GMT-5”和本地是UTC?它是透明处理的吧?
猜你喜欢
  • 1970-01-01
  • 2010-09-18
  • 2015-11-07
  • 2018-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多