API 用于时区转换

API for timezone conversion

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

不同时区之间日期时间转换的解释 -

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

编辑 1 -

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

还有这个问题,我希望了解一些在线可用的东西 api,它们可能会一直被点击,而不是依赖于 java8.[=13] 提供的像 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 年,伊斯坦布尔不会考虑任何夏令时,这似乎不在此 ZonedDateTime 库中考虑。

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

Now the problem is that from 2017 to 2020 there won't be any dst considered in Istanbul, which seems like is not considered in this ZonedDateTime library.

这不是图书馆的问题。如果时区信息不正确(我说 "if"),那是因为您的 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 库不使用系统时区规则。相反,他们依赖于作为 Java 安装一部分的 IANA 数据(又名 Olson 数据)派生的文件。如果您运行正在使用旧版本的Java,您可能拥有旧版本的时区数据。但是有两个解决方案:

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