根据Java中的UTC偏移量获取时区快捷方式

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

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

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

提前致谢。

user2580516的答案是正确的。 我可以添加更多。

避免使用三字母代码

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

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

时区名称

使用适当的时区名称而不是3个字母的代码。 例如:“欧洲/巴黎”,“美国/蒙特利尔”和“亚洲/加尔各答”。

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

优秀的日期时间库Joda-Time有一种生成其当前已知时区名称列表的方法。

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

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

时区不仅仅是UTC / GMT的数字偏移。 时区还包含夏令时 (DST)和其他exception的规则集。

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

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

另一个转折……也许是夏天时在伦敦录制的+01:00 。 在夏天,伦敦观察夏令时并提前1小时移动时钟。 标准时间为+00:00 (UTC / GMT),DST提前一小时移动它们。

还有另一种扭曲……即使你说“只选一个”,哪一个? 对于标准时间内的+00:00 ,至少有2个三字母代码( CETMET )和37个指定时区跨越两个大陆。

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

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

记录时区

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

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

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

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