从没有时区名称的时区获取时区偏移值

新手上路,请多包涵

我需要以 [+/-]hh:mm 格式保存手机的时区

我正在使用 TimeZone 类来处理这个问题,但我可以获得的唯一格式如下:

 PST -05:00
GMT +02:00

我宁愿不对结果进行子字符串化,是否有任何键或选项标志我可以设置为只获取值而不是该时区的名称(GMT/CET/PST …)?

原文由 Mr Bean 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 558
2 个回答

我需要以 [+/-]hh:mm 格式保存手机的时区

不,你不知道。偏移量本身是不够的,您需要存储整个时区名称/ID。例如,我住在奥斯陆,我当前的偏移量是 +02:00,但在冬天(由于 dst )是 +01:00。标准时间和夏令时之间的确切切换取决于您不想探索的因素。

因此,我没有存储 + 02:00 (或者应该是 + 01:00 ?),而是存储 "Europe/Oslo" 在我的数据库中。现在我可以使用以下方法恢复完整配置:

 TimeZone tz = TimeZone.getTimeZone("Europe/Oslo")

想知道我今天的时区偏移量是多少?

 tz.getOffset(new Date().getTime()) / 1000 / 60   //yields +120 minutes

然而,在 12 月也是如此:

 Calendar christmas = new GregorianCalendar(2012, DECEMBER, 25);
tz.getOffset(christmas.getTimeInMillis()) / 1000 / 60   //yields +60 minutes

足以说明:存储时区名称或 ID,每次你想显示日期时,检查当前偏移量(今天)是多少,而不是存储固定值。您可以使用 TimeZone.getAvailableIDs() 枚举所有支持的时区 ID。

原文由 Tomasz Nurkiewicz 发布,翻译遵循 CC BY-SA 3.0 许可协议

@MrBean - 我遇到了类似的情况,我不得不调用第 3 方 Web 服务并以 +/-hh:mm 格式传入 Android 设备的当前时区偏移量。这是我的解决方案:

 public static String getCurrentTimezoneOffset() {

    TimeZone tz = TimeZone.getDefault();
    Calendar cal = GregorianCalendar.getInstance(tz);
    int offsetInMillis = tz.getOffset(cal.getTimeInMillis());

    String offset = String.format("%02d:%02d", Math.abs(offsetInMillis / 3600000), Math.abs((offsetInMillis / 60000) % 60));
    offset = (offsetInMillis >= 0 ? "+" : "-") + offset;

    return offset;
}

原文由 PuguaSoft 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题