以毫秒为单位获得实际的DST节省

zla*_*mic 9 java timezone calendar dst

我在Java Swing中制作模拟时钟.要计算时钟指针角度,我需要:

  1. UTC时间,以毫秒为单位,我可以得到 System.currentTimeMillis()
  2. TimeZone偏移量
  3. TimeZone DST节省.

对于2)和3)我想到使用 TimeZone.getDefault().getRawOffset()TimeZone.getDefault().getDSTSavings().

但无论当前日期是在冬季/夏季时间getDSTSavings()总是返回3600000.
它看起来像只检查,看看是否能区在DST管理,如果这样返回3600000,否则0.
这是一个错误getDSTSavings()吗?
如果不是那么只有以DST毫秒为单位获得当前校正的方法是使用Calendar实例,如:Calendar.getInstance.get(Calendar.DST_OFFSET)

Calendar cal1 = Calendar.getInstance(TimeZone.getDefault());        //currentZone: CET/CEST +1/+2, GMT+1:00
System.out.println("System time, " + System.currentTimeMillis()); //UTC current milis
System.out.println("Calendar time, " + cal1.getTime().getTime());   //UTC current milis
System.out.println("Calendar milis, " + cal1.getTimeInMillis());       //UTC current milis
System.out.println("Calendar Zone Offset: " + cal1.get(Calendar.ZONE_OFFSET));
System.out.println("Calendar DST Offset: " + cal1.get(Calendar.DST_OFFSET));
System.out.println("Calendar Zone Offset: " + cal1.getTimeZone().getRawOffset());
System.out.println("Calendar DST Offset: " + cal1.getTimeZone().getDSTSavings());
System.out.println("");

// Winter time, CET
cal1.set(2010, 11, 15, 14, 15, 5);
System.out.println("Calendar milis, " + cal1.getTimeInMillis()); //UTC
System.out.println("Calendar Zone Offset: " + cal1.get(Calendar.ZONE_OFFSET)); // 3600000 correct
System.out.println("Calendar DST Offset: " + cal1.get(Calendar.DST_OFFSET)); // 0 correct
System.out.println("Calendar Zone Offset: " + cal1.getTimeZone().getRawOffset()); // 3600000 correct
System.out.println("Calendar DST Offset: " + cal1.getTimeZone().getDSTSavings()); // 3600000 wrong !!!
System.out.println("");

// Summer time - CEST
cal1.set(2010, 8, 15, 14, 15, 5);
System.out.println("Calendar milis, " + cal1.getTimeInMillis()); //UTC
System.out.println("Calendar Zone Offset: " + cal1.get(Calendar.ZONE_OFFSET)); // 3600000 correct
System.out.println("Calendar DST Offset: " + cal1.get(Calendar.DST_OFFSET)); // 3600000 correct
System.out.println("Calendar Zone Offset: " + cal1.getTimeZone().getRawOffset()); // 3600000 correct
System.out.println("Calendar DST Offset: " + cal1.getTimeZone().getDSTSavings()); // 3600000 correct
Run Code Online (Sandbox Code Playgroud)

dog*_*ane 12

以下是如何使用DST的示例:

TimeZone london = TimeZone.getTimeZone("Europe/London");
System.out.println(london.getOffset(date.getTime()));
Run Code Online (Sandbox Code Playgroud)

如果夏令时在指定日期在伦敦生效,则会打印3600000.否则它将打印0.

  • 是的,这就是我想要的.偏移只是区域和时间依赖.现在我不需要在每个tick上创建新的日历实例.而是在启动时钟时检测当前区域.final TimeZone timeZone = TimeZone.getDefault(); final long utcTime = System.currentTimeMillis(); final long timeOffset = timeZone.getOffset(utcTime); final long t = utcTime + timeOffset; (3认同)