【发布时间】:2016-02-01 14:57:42
【问题描述】:
在将其标记为重复之前,请仔细阅读,另外不能使用 Joda Time 和 Java 8 time.util*。
我正在尝试获取启用 DST 的国家/地区的当前日期。由于使用时区,它会得到[local-millis] = [UTC-millis] + [offset-millis],所以我添加了DST_OFFSET 以获取启用夏令时的国家/地区的时间,就像在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())); 给了我错误的结果,但是夏令时在那里,你可以在这个链接中看到Istanbul clock
Current date and time : 2015-11-01 19:54:49
The TimeZone is : Europe/Istanbul.
Brazil 时区的相同逻辑在 inDaylightTime 中给出了正确的结果,但现在提前一小时显示结果
以讨论的方式排序的所有代码的 Ideone 链接 1.https://ideone.com/4NR5Ym 2.https://ideone.com/xH7vhp 3.https://ideone.com/tQenb5
我的问题是timeZone.inDaylightTime(new Date()) 与伊斯坦布尔时区有什么问题。为什么显示为假。为什么对于巴西,即使inDaylightTime 为真,我也没有得到当前的 DST 时间。
处理这种情况的正确方法是什么?
【问题讨论】:
标签: java datetime calendar timezone dst