在标记它之前,请彻底阅读它。另外,不能使用Joda Time和Java 8 Time.util*.
我正在尝试获取启用夏令时的国家/地区的当前日期。由于时区是[local-millis] = [UTC-millis] + [offset-millis]
,所以我添加了DST_OFFSET
来获取启用DST的国家的时间,就像在Linux机器GMT_TIME + LOCAL_TIME_ZONE_OFFSET + DST_OFFSET
上获取当前本地时间一样。
打印伊斯坦布尔当前时间的代码,该时间当前已启用夏令时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());
}
但问题是,如果我这样做,我得到的输出没有任何夏令时。打印System.out.println(timeZone.inDaylightTime(new Date()));
给了我错误的结果,但正如你在伊斯坦布尔时钟的链接中看到的那样,夏令时是存在的
Current date and time : 2015-11-01 19:54:49
The TimeZone is : Europe/Istanbul.
巴西时区的逻辑与我在DaylightTime中的逻辑相同,但现在提前一小时显示结果
Ideone链接以1中讨论的方式排序的所有代码。https://ideone.com/4NR5Ym2.https://ideone.com/xH7vhp3.https://ideone.com/tQenb5
我的问题是timeZone.inDaylightTime(new Date())
与伊斯坦布尔时区有什么问题。为什么它显示错误。为什么对于巴西来说,即使inDaylightTime
是真的,我也没有得到当前的夏令时。处理这种情况的正确方法是什么?
今天土耳其似乎有一些关于时区和夏令时的问题。
这可能是因为土耳其将夏令时从11月1日改为11月8日。
JVM中的时区数据可能不是最新的。Oracle对其JVM进行了更新。
从上面的链接下载的时区数据更新程序是一个可执行的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以接受最新的土耳其夏令时更改(正如Monz在回答中所描述的),您应该可以开始了。