如何在没有 Joda Time 的 Java 7 中正确处理夏令时?
How to handle daylight saving time properly in Java 7 without Joda Time?
在标记它重复之前仔细阅读加上不能使用 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,因此结果是夏令时,正如您在此 link Istanbul clock
中看到的那样
Current date and time : 2015-11-01 19:54:49
The TimeZone is : Europe/Istanbul.
时区的相同逻辑 Brazil 使我对 inDaylightTime 正确,但现在显示结果提前一小时
Ideone link 以讨论的方式排序的所有代码 1. https://ideone.com/4NR5Ym 2.https://ideone.com/xH7vhp 3.https://ideone.com/tQenb5
我的问题是 timeZone.inDaylightTime(new Date())
与伊斯坦布尔时区有什么问题。为什么显示是假的。为什么对于巴西,即使 inDaylightTime
为真,我也得不到当前 DST 时间。
处理这种情况的正确方法是什么?
今天土耳其的时区和夏令时似乎有一些问题。
这可能是因为 Turkey has changed the date for the daylight savings switch from November 1 to November 8.
您的 JVM 中的时区数据可能与更改不同步。 Oracle has an update for their JVM.
您从上面link下载的时区数据更新程序是一个可执行的jar 文件。要在 unix 主机上更新 JVM:
sudo java -jar tzupdater.jar --update --location http://www.iana.org/time-zones/repository/tzdata-latest.tar.gz
该工具似乎没有在更新时输出任何内容,因此要验证 运行:
java -jar tzupdater.jar --version
土耳其更新后的时区数据版本为tzdata2015g
你不应该这样做:
calendar.add(Calendar.MILLISECOND, timeZone.getDSTSavings());
你也不应该这样做:
if (timeZone.inDaylightTime(new Date())){
calendar.add(Calendar.MILLISECOND, timeZone.getDSTSavings());
}
您不需要手动调整时间。它是根据您格式化的日期自动为您完成的。调用 add
只会移动您正在使用的瞬时时间点。
删除这些行,并更新您的 JVM 以接受最新的土耳其 DST 更改(如 Monz 在他的回答中所述),您应该可以开始了。
在标记它重复之前仔细阅读加上不能使用 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,因此结果是夏令时,正如您在此 link Istanbul clock
Current date and time : 2015-11-01 19:54:49
The TimeZone is : Europe/Istanbul.
时区的相同逻辑 Brazil 使我对 inDaylightTime 正确,但现在显示结果提前一小时
Ideone link 以讨论的方式排序的所有代码 1. https://ideone.com/4NR5Ym 2.https://ideone.com/xH7vhp 3.https://ideone.com/tQenb5
我的问题是 timeZone.inDaylightTime(new Date())
与伊斯坦布尔时区有什么问题。为什么显示是假的。为什么对于巴西,即使 inDaylightTime
为真,我也得不到当前 DST 时间。
处理这种情况的正确方法是什么?
今天土耳其的时区和夏令时似乎有一些问题。
这可能是因为 Turkey has changed the date for the daylight savings switch from November 1 to November 8.
您的 JVM 中的时区数据可能与更改不同步。 Oracle has an update for their JVM.
您从上面link下载的时区数据更新程序是一个可执行的jar 文件。要在 unix 主机上更新 JVM:
sudo java -jar tzupdater.jar --update --location http://www.iana.org/time-zones/repository/tzdata-latest.tar.gz
该工具似乎没有在更新时输出任何内容,因此要验证 运行:
java -jar tzupdater.jar --version
土耳其更新后的时区数据版本为tzdata2015g
你不应该这样做:
calendar.add(Calendar.MILLISECOND, timeZone.getDSTSavings());
你也不应该这样做:
if (timeZone.inDaylightTime(new Date())){
calendar.add(Calendar.MILLISECOND, timeZone.getDSTSavings());
}
您不需要手动调整时间。它是根据您格式化的日期自动为您完成的。调用 add
只会移动您正在使用的瞬时时间点。
删除这些行,并更新您的 JVM 以接受最新的土耳其 DST 更改(如 Monz 在他的回答中所述),您应该可以开始了。