Получите фактическую экономию на летнее время в миллисекундах

Я делаю аналоговые часы на Java Swing. Для расчета углов указателя часов мне нужно:

  1. Время UTC в миллисекундах, которое я могу получить с помощью System.currentTimeMillis ()
  2. Смещение часового пояса
  3. Экономия часового пояса на летнее время.

Для 2) и 3) I думал об использовании TimeZone.getDefault (). GetRawOffset () и TimeZone.getDefault (). GetDSTSavings () .

Но getDSTSavings () [1113713719] всегда возвращает 3600000 независимо от текущей даты - зимнее / летнее время.
Похоже, он проверяет только, находится ли эта зона под управлением DST , и если да, то возвращает 3600000 в противном случае 0 .
Это ошибка в getDSTSavings () ?
Если нет, то единственный способ получить текущую коррекцию DST в миллисекундах - это использовать экземпляр календаря, например: 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
9
задан Cœur 2 January 2017 в 18:07
поделиться