是否有任何API可用于不同时区之间的日期时间转换,类似于谷歌地图的时区api。
解释不同时区之间的日期时间转换 -
给定基准时区,基准时区和目标时区的日期时间,api以目标时区返回日期时间。 (这也考虑了像dst这样的概念)
编辑1 -
根据收到的关于这个问题的负面评论,不得不提供一些关于这个问题需要的更多细节,以及已经用不同方法浪费的努力。
同样有了这个问题,我期待知道一些在线可用的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。
答案 0 :(得分:3)
现在的问题是,从2017年到2020年,在伊斯坦布尔没有考虑任何问题,这似乎在这个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,则可能有旧版本的时区数据。但有两种解决方案: