如何在java中转换windows和IANA时区



我需要在IANA时区之间进行转换&Windows时区&亦然。还有另一个问题:如何在Windows和IANA时区之间进行转换?

它指定Noda时间库可以在。net中使用

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

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

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

我已经在java库Time4J中实现了对Windows区域的支持。最后一个版本v4.2也可以与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时区(参见我的回答的第一部分)。

我终于要自己实现了。xml需要更新大量缺失的时区条目。我不会发布更新后的文件,因为有许多时区在Windows offset &IANA偏移量。

同样,对于一个Windows时区,可以有多个IANA时区。因此,我必须根据用户的地理位置(地址)等其他可用信息来选择最合适的实现。

有了这个,我只是使用windowsZones.xml从Windows时区获得IANA时区&亦然。

相关内容

  • 没有找到相关文章

最新更新