如何在java中翻译Windows和IANA时区

时间:2015-07-16 09:21:42

标签: java timezone java-8

我需要在IANA时区和之间进行翻译。 windows timezone&反之亦然。报告了另一个问题:How to translate between Windows and IANA time zones?

它指定Noda时间库可以在.Net

中使用

我们有没有在Java中使用的库?或者在java中使用的任何其他实用程序?

3 个答案:

答案 0 :(得分:1)

这可能是您所需要的,但我不知道它是否适用于您的所有用例:

for (String tzId : TimeZone.getAvailableIDs()) {
  TimeZone tz = TimeZone.getTimeZone(tzId);
  if (tz.getDisplayName(Locale.ENGLISH).equals("Eastern Standard Time")) {
    System.out.println("tz = " + tzId);
  }
}

答案 1 :(得分:1)

我已在我的Java库support for Windows zones中实现了Time4J。最后一个版本v4.2也是interoperable with Java-8所以很容易将所有基本的Time4J类型转换为java.time - 等价物。例如,在构造和解析过程中,可以将Windows区域识别为字符串:

  // conversion Windows to IANA
  WindowsZone wzn = WindowsZone.of("Eastern Standard Time");
  TZID winzone = wzn.resolveSmart(Locale.US);
  System.out.println(winzone.canonical()); // WINDOWS~America/New_York

  // usage in timezone calculation
  Timezone tz = Timezone.of(winzone);
  System.out.println(Moment.UNIX_EPOCH.toZonalTimestamp(winzone)); // 1969-12-31T19

  // usage in parsing and formatting
  ChronoFormatter<Moment> f =
    ChronoFormatter.ofMomentPattern(
      "MM/dd/uuuu hh:mm a zzzz", PatternType.CLDR, Locale.US, winzone);
  Moment pacificTime = f.parse("07/17/2015 02:45 PM Pacific Standard Time");
  System.out.println(f.format(pacificTime)); // 07/17/2015 05:45 PM Eastern Standard Time

如您所见,需要区域设置信息才能将Windows区域(如“东部标准时间”)映射到Olson / IANA标识符(如“America / New_York”)。基础数据和映射信息来自CLDR。

从IANA到Windows的相反方式可能会以这种简单的方式完成:

String iana = "America/New_York";
String winzone = "WINDOWS~" + iana;
NameStyle dummy = NameStyle.LONG_STANDARD_TIME; // does not really matter
String name = Timezone.of(winzone).getDisplayName(dummy, Locale.US);
System.out.println(name); // Eastern Standard Time

但是,此反向转换可能不适用于所有iana标识符,因为与IANA-TZDB相比,Windows仅支持非常简化的时区子集。我也认为反向的方法在实践中很难使用。用户应该默认使用IANA时区,并且只使用Windows时区,如果这是(不可避免的)输入要处理(请参阅我的答案的第一部分)。

答案 2 :(得分:0)

我最终必须自己实施。需要更新windowsZones.xml以查找大量缺少的时区条目。我没有发布更新的文件,因为有许多时区,Windows偏移和放大器之间没有完美的匹配。 IANA抵消。

此外,对于一个Windows时区,可能有多个IANA时区。因此,我必须根据其他可用信息(例如用户地理位置等)进行实施以选择最合适的。

有了这个,我只是使用windowsZones.xml从Windows时区获取IANA时区&amp;反之亦然。