gpt4 book ai didi

java - 土耳其 ("Asia/Istanbul"或 "Europe/Istanbul"上的 JDK 时区问题)

转载 作者:搜寻专家 更新时间:2023-11-01 02:37:31 48 4
gpt4 key购买 nike

有人可以帮忙解决以下问题吗?

  1. 我的操作系统是最新的 windows 10,时区是 (UTC+0300) Istanbul(夏令时已被移除,时区设置为 +0300 在土耳其的最新规定之后 - 2016 年 9 月 7 日)

  2. 我使用的是最新的 JDK 1.8.0_131。此 JDK 的 Tzdata 版本是 tzdata2017a,其中包括土耳其的时区更改。

这是我在 main 方法中实现的应用程序的一小部分:

import java.util.Date;
import java.util.TimeZone;

public class TestMain {

public static void main(String[] args) {
String timeZoneStr = "Asia/Istanbul";
TimeZone timeZone = TimeZone.getTimeZone(timeZoneStr);
Date localDate = new Date();
System.out.println(localDate);
localDate.setTime(155631515L);
System.out.println(localDate);
System.out.println(getUTCFromLocal(localDate, timeZone));
}

public static Date getUTCFromLocal(Date localDate, TimeZone localTimeZone) {
return new Date(localDate.getTime()-localTimeZone.getOffset(localDate.getTime()));
}
}

代码的结果是:

Sun May 21 15:19:48 EET 2017

Fri Jan 02 21:13:51 EET 1970

Fri Jan 02 19:13:51 EET 1970

根据最新的时区更新,输出的最后一行应该是“Fri Jan 02 18:13:51 EET 1970”,而不是“Fri Jan 02 19:13:51 EET 1970”。

除此之外,当我创建新的日期对象 (new java.util.Date()) 时,该对象中的信息似乎是正确的,时区在 +0300,但是如果我使用 Date 对象的 setTime 方法,对象时区信息将更改为 +0200

当使用 new java.util.Date() 创建日期对象时:

Screenshot when object created

localDate.setTime(155631515L) 方法执行时:

Screenshot when setTime(155631515L) method used

我还在其他 JDK 版本上重现了同样的问题。

最佳答案

土耳其的时区更改是在 2016 年 9 月。因此,对于 1970 年的日期,旧规则适用。那时,时区是 +0200,因为你有一个从一月开始的日期,所以没有添加夏令时。如果您尝试从 1970 年 7 月开始的日期,您应该与 UTC 相差 3 小时。

尽管有时被称为“我们全年使用夏令时”,但自 2016 年以来的变化实际上意味着土耳其将其时区移动了一个小时,现在全年都采用新时区的非夏令时。

如果您使用 2016 年 9 月左右的日期,您会发现计算发生变化的时间点。

关于java - 土耳其 ("Asia/Istanbul"或 "Europe/Istanbul"上的 JDK 时区问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44097034/

48 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com