Java 时区转换API

Java 时区转换API,java,datetime,jodatime,datetime-conversion,Java,Datetime,Jodatime,Datetime Conversion,是否有任何API可用于不同时区之间的日期时间转换,类似于谷歌地图的时区API 解释不同时区之间的日期时间转换- 给定基本时区、基本时区中的datetime和目标时区,一个返回目标时区中的datetime的api。(这也考虑了dst等概念) 编辑1- 根据收到的关于这个问题的负面评论,我们不得不就这个问题的需要以及不同方法已经浪费的努力提供更多的细节 还有这个问题,我希望了解一些在线可用的api,它们可能会一直受到攻击,而不是依赖java8提供的ZoneDateTime之类的库 java 8的Zo

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

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

给定基本时区、基本时区中的datetime和目标时区,一个返回目标时区中的datetime的api。(这也考虑了dst等概念)

编辑1-

根据收到的关于这个问题的负面评论,我们不得不就这个问题的需要以及不同方法已经浪费的努力提供更多的细节

还有这个问题,我希望了解一些在线可用的api,它们可能会一直受到攻击,而不是依赖java8提供的ZoneDateTime之类的库

java 8的ZoneDateTime的一些问题-

请参见下面的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);
由上述代码生成的输出为-

```

```

现在的问题是,从2017年到2020年,伊斯坦布尔将不会考虑任何dst,这似乎在这个分区时间图书馆中没有考虑

所以我想知道其他的替代品。最好是基于web的API

现在的问题是,从2017年到2020年,伊斯坦布尔将不会考虑任何dst,这似乎在这个分区时间图书馆中没有考虑

这不是图书馆的问题。如果时区信息不正确(我说“如果”),那么这是由于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-veEurope/伊斯坦布尔时,它同意这一点。(时区规则文件是通过软件包管理器分发的,假设您的系统一直处于修补状态。)

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

  • 更新至您的Java版本的最新版本。(截至2017年3月,这不适用于Java的生命周期结束版本,即Java 7及更早版本。)
  • 下载,并使用Oracle更新JVM/JRE安装

  • 如果您使用的是java>=8,请使用新的日期时间API:如果您使用的是java Hi,请尝试两种建议的解决方案,但在这种情况下仍然没有成功。。。另外,zdump向我展示了与您提到的类似的响应。但即使在用IANA时区数据库更新之后。。。转换是错误的。如果您正确地更新了Java时区信息,但它仍然不适用于您,那么您可能运气不好。其他Java API将使用相同的方法(否则会有更严重的问题!),并且由于其他原因,依赖网络可访问服务进行TZ查找是一个坏主意。无法使ZoneDateTime库工作。。。根据您的建议,我们选择了其他Java API,选择了joda时间库。。。而且对我很有效。。Thanks@Sumit你能接受这个答案吗?因为它解决了你的问题
    # 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