【问题标题】:API for timezone conversion时区转换API
【发布时间】:2017-03-10 12:59:40
【问题描述】:

是否有任何 API 可用于不同时区之间的日期时间转换,类似于谷歌地图的时区 API。

不同时区之间的日期时间转换说明 -

给定基准时区、基准时区中的日期时间和目标时区,一个返回目标时区中日期时间的 api。 (其中也考虑了像 dst 这样的概念)

编辑 1 -

根据收到的关于这个问题的负面评论,必须提供更多细节来说明这个问题的需要以及已经用不同方法浪费的努力。

还有这个问题,我希望了解一些在线可用的 api,这些 api 可能一直受到影响,而不是依赖于 java8 提供的 ZonedDateTime 之类的库。

java 8 ZonedDateTime 的一些问题-

见下面的scala代码-

import java.time.{LocalDateTime, ZoneId, ZoneOffset, ZonedDateTime}
import java.time.format.DateTimeFormatter

val istanbul: ZoneId = ZoneId.of("Europe/Istanbul");
val str: String = "2017-03-29 17:00:00";
val str1: String = "2017-03-24 17:00:00";
val formatter: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
val localtDateAndTime: LocalDateTime = LocalDateTime.parse(str, formatter);
val localtDateAndTime1: LocalDateTime = LocalDateTime.parse(str1, formatter);
val dateAndTimeInIstanbul: ZonedDateTime = ZonedDateTime.of(localtDateAndTime, istanbul );
val dateAndTimeInIstanbul1: ZonedDateTime = ZonedDateTime.of(localtDateAndTime1, istanbul );


val utcDate: ZonedDateTime = dateAndTimeInIstanbul.withZoneSameInstant(ZoneOffset.UTC);
val utcDate1: ZonedDateTime = dateAndTimeInIstanbul1.withZoneSameInstant(ZoneOffset.UTC);

System.out.println("Original date and time in a particular timezone : " + dateAndTimeInIstanbul);
System.out.println("Converted date and time in UTC : " + utcDate);

System.out.println("Origianl date and time in a particular timezone : " + dateAndTimeInIstanbul1);
System.out.println("Converted date and time in UTC : " + utcDate1);

以上代码生成的输出是-

```

Original date and time in a particular timezone : 2017-03-29T17:00+03:00[Europe/Istanbul]
Converted date and time in UTC : 2017-03-29T14:00Z


Origianl date and time in a particular timezone : 2017-03-24T17:00+02:00[Europe/Istanbul]
Converted date and time in UTC : 2017-03-24T15:00Z

```

现在的问题是,从 2017 年到 2020 年,伊斯坦布尔不会考虑任何 dst,这似乎没有在此 ZonedDateTime 库中考虑。

所以想了解其他一些替代方案。最好是基于 Web 的 API。

【问题讨论】:

标签: java datetime jodatime datetime-conversion


【解决方案1】:

现在的问题是,从 2017 年到 2020 年,伊斯坦布尔不会考虑任何 dst,这似乎没有在此 ZonedDateTime 库中考虑。

这不是图书馆的问题。如果时区信息不正确(我说“如果”),那么这是由于您的 JVM 使用的时区规则存在问题。

以下是 IANA 对伊斯坦布尔的最新时区规则:

# Zone  NAME            GMTOFF  RULES   FORMAT  [UNTIL]
Zone    Europe/Istanbul 1:55:52 -       LMT     1880
                        1:56:56 -       IMT     1910 Oct
                        2:00    Turkey  EE%sT   1978 Oct 15
                        3:00    Turkey  +03/+04 1985 Apr 20
                        2:00    Turkey  EE%sT   2007
                        2:00    EU      EE%sT   2011 Mar 27  1:00u
                        2:00    -       EET     2011 Mar 28  1:00u
                        2:00    EU      EE%sT   2014 Mar 30  1:00u
                        2:00    -       EET     2014 Mar 31  1:00u
                        2:00    EU      EE%sT   2015 Oct 25  1:00u
                        2:00    1:00    EEST    2015 Nov  8  1:00u
                        2:00    EU      EE%sT   2016 Sep  7
                        3:00    -       +03

最后一行是说从 2016 年 9 月 7 日凌晨 3 点开始,时间偏移量为 UTC + 3 小时。来源是 IANA 时区数据库的 2017a 版本。

当我在我的 Linux 系统上运行 zdump -V Europe/Istanbul 时,它同意这一点。 (时区规则文件是通过包管理器分发的,假设您为系统打了补丁。)

现在 Java 有点不同了。 Java 库不使用系统时区规则。相反,它们依赖于从 IANA 数据(又名 Olson 数据)派生的文件,该文件是 Java 安装的一部分。如果您运行的是旧版本的 Java,则可能有旧版本的时区数据。但是有两种解决方案:

  1. 更新到您的 Java 版本的最新版本。 (这不适用于 Java 的终止版本;即 Java 7 及更早版本......截至 2017 年 3 月。)
  2. 下载 latest timezone database from IANA,并使用 Oracle Timezone Updater Tool 更新您的 JVM / JRE 安装。

【讨论】:

  • 嗨,尝试了建议的两种解决方案,但在这种情况下仍然没有运气...... zdump 也向我展示了与您提到的类似的响应。但即使在使用 IANA 时区数据库进行更新后......转换是错误的......
  • 如果您正确更新了 Java 时区信息,但它仍然对您不起作用,那么您可能不走运。替代的 Java API 将使用相同的方法(否则它们会遇到更严重的问题!)并且由于其他原因,依赖网络可访问的服务进行 TZ 查找是一个坏主意。
  • 无法使 ZonedDateTime 库工作......根据您的建议,选择了替代 Java API,选择了 joda-time 库......对我来说效果很好......谢谢
  • @Sumit 你能接受答案吗,因为它解决了你的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-26
  • 1970-01-01
  • 2010-11-16
  • 1970-01-01
  • 2012-06-15
  • 2014-11-30
  • 2019-06-14
相关资源
最近更新 更多