gpt4 book ai didi

java - 如何在没有 Joda Time 的情况下在 Java 7 中正确处理夏令时?

转载 作者:搜寻专家 更新时间:2023-10-31 19:44:56 24 4
gpt4 key购买 nike

在将其标记为重复之前,请仔细阅读加上不能使用 Joda Time 和 Java 8 time.util*

我正在尝试获取启用 DST 的国家/地区的当前日期。由于时区它得到 [local-millis] = [UTC-millis] + [offset-millis] 所以我添加了 DST_OFFSET 来获取时间启用 DST 的国家/地区,就像在 Linux 机器上所做的那样 GMT_TIME + LOCAL_TIME_ZONE_OFFSET + DST_OFFSET 以获取当前本地时间。

打印Istanbul当前时间的代码目前已启用 DST 1 小时。

public class DstInstanbul {

public static void main(String...args){

Calendar calendar = Calendar.getInstance();

TimeZone timeZone = TimeZone.getTimeZone("Europe/Istanbul");

calendar.setTimeZone(timeZone);

calendar.add(Calendar.MILLISECOND, timeZone.getDSTSavings());


SimpleDateFormat simpleDateFormatLocal = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
simpleDateFormatLocal.setTimeZone(TimeZone.getTimeZone("Europe/Istanbul"));

System.out.println("Current date and time : " + simpleDateFormatLocal.format(calendar.getTime()));


System.out.println("Current date and time : " + simpleDateFormatLocal.format(calendar.getTime()));
System.out.println("The TimeZone is : " + calendar.getTimeZone().getID());

}
}

这给了我正确的输出

Current date and time : 2015-11-01 20:49:54
The Hour of the Day is : 20
The TimeZone is : Europe/Istanbul

但由于上面的代码不是那么通用,所以我尝试添加以下行,这样如果只启用了日光,那么只添加dstSaving 所以我更改了以下 calendar.add(Calendar.MILLISECOND, timeZone.getDSTSavings());

if (timeZone.inDaylightTime(new Date())){
calendar.add(Calendar.MILLISECOND, timeZone.getDSTSavings());
}

但问题是,如果我这样做,我得到的输出没有任何 DST。并打印 System.out.println(timeZone.inDaylightTime(new Date())); 给了我 false,因此结果是夏令时,正如您在此链接中看到的那样 Istanbul clock

Current date and time : 2015-11-01 19:54:49
The TimeZone is : Europe/Istanbul.

时区逻辑相同Brazil对 inDaylightTime 给出 true,但现在提前一小时显示结果

Ideone 链接以讨论 1 的方式排序的所有代码。https://ideone.com/4NR5Ym 2. https://ideone.com/xH7vhp 3. https://ideone.com/tQenb5

我的问题是 timeZone.inDaylightTime(new Date()) 与伊斯坦 boolean 时区有什么问题。为什么显示是假的。为什么对于巴西,即使 inDaylightTime 为真,我也得不到当前 DST 时间。处理这种情况的正确方法是什么?

最佳答案

你不应该这样做:

calendar.add(Calendar.MILLISECOND, timeZone.getDSTSavings());

你也不应该这样做:

if (timeZone.inDaylightTime(new Date())){
calendar.add(Calendar.MILLISECOND, timeZone.getDSTSavings());
}

您无需手动调整时间。它是根据您格式化的日期自动为您完成的。调用 add 只会移动您正在使用的瞬时时间点。

删除这些行,并更新您的 JVM 以接受最新的土耳其 DST 更改(如 Monz 在他的回答中所述),您应该一切顺利。

关于java - 如何在没有 Joda Time 的情况下在 Java 7 中正确处理夏令时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33465540/

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