在Java中获取基于UTC偏移量的时区快捷方式

时间:2014-02-14 23:26:38

标签: java date calendar timezone

我希望根据UTC偏移量获得EST(东部标准),PST(太平洋)等时区快捷方式。我意识到这不是一个简单的问题,并且可以有多个基于特定偏移的位置,但这没关系。

我正在尝试使用Util Calendar对象,但我似乎没有获得字符串,而只是偏移量。

public String foo(int offset)
{
....
return TimeZoneShortcut;
} 

提前致谢。

2 个答案:

答案 0 :(得分:3)

answer by user2580516是正确的。我可以多补充一点。

避免使用三字母代码

三个字母的时区ID既不是标准化也不是唯一的。避免他们。

例如,IST用于表示India Standard Time Irish Standard Time。有很多这样的碰撞。

时区名称

使用正确的时区名称,而不是3个字母的代码。例如:“Europe / Paris”,“America / Montreal”和“Asia / Kolkata”。

似乎没有时区名称的官方标准。这让我感到惊讶;希望我错了,有人可以填补我。无论如何,常用​​的列表来自tz database(以前称为 Olson数据库),{{3} }。

优秀的日期时间库listed in this Wikipedia page有一种生成其Joda-Time列表的方法。

时区名称会随着时间的推移而变化,有些会被添加,而且规则也会发生变化。所有这一切都是由政治家和官僚决定的,所以变化是最后一刻而且并不总是明智的。因此,您应该注意保持日期时间库的最新状态,或者至少更新其包含的时区数据库。

不可能的问题 - 无法确定时区

currently known time zone names不仅仅是time zone / GMT的数字偏移量。时区还包含UTC(DST)和其他异常的规则集。

因此您无法从偏移量推断出时区。你可以猜测,但你无法确定。

例如,取+01:00的偏移量。是“欧洲/巴黎”还是“非洲/拉各斯”?两者都比UTC早一个小时。那么你使用哪个问题呢?是的......法国观察夏令时,但尼日利亚没有。分配错误的时区意味着您的日期时间计算错误。

另一个转折......也许在夏天的时候,+01:00被记录在伦敦。在夏天,伦敦观察夏令时并提前1小时移动时钟。标准时间为+00:00(UTC / GMT),DST提前一小时将其移动。

又一个转折......即使你说“只选一个”,哪一个?对于标准时间内的+00:00,至少有两个三字母代码(CETMET)和37个指定时区跨越两大洲。

也许你在想,“我可以用日期来判断DST是否有效”。不,DST在不同时区的不同日期开始和结束,共享相同的偏移量。此外,一些国家(时区)足够明智,不会愚弄夏令时。

所以关于你的问题“不是一个简单的问题......但是没关系”是错误的。这不是问题,不可能。就像问题一样,“生日快乐,决定一个人”。您可以确定某个人或时区正确,但您无法确定哪个 正确。

记录时区

如果知道时区(地区和规则)对您很重要,则必须记录区域信息以及日期时间。例如,这可能意味着数据库中有一个额外的字段。

Daylight Saving Time带来一个新的Java 8,灵感来自java.time.8 package,由Joda-Time定义。设计师已经认识到时区作为日期时间值的一部分的重要性。因此,他们的设计包括:

  • 主要日期时间类以“Zoned”一词开头,以强调该课程包含时区信息:JSR 310
  • 他们在ZonedDateTime类上的toString实现通过在括号中附加时区名称来扩展ZonedDateTime格式。而不是:2014-02-14T20:51:55.427-08:00它输出
    2014-02-14T20:51:55.427-08:00[America/Los_Angeles]

答案 1 :(得分:0)

使用TimeZone.getAvailableIDs(),并选择只有三个字母的一个(可能是第一个)。您必须将偏移量调整为数字毫秒才能传递到该函数。不推荐使用三个字母的ID,但听起来你没问题。