Estoy haciendo un reloj analógico en Java Swing. Para calcular los ángulos de puntero de reloj que necesito: tiempoObtenga ahorros reales de DST en milisegundos
- UTC en milisegundos, que puedo conseguir con
System.currentTimeMillis()
- zona horaria compensar
- ahorro de zona horaria de DST.
Para 2) y 3) I pensado en utilizar TimeZone.getDefault().getRawOffset()
y TimeZone.getDefault().getDSTSavings()
.
Pero getDSTSavings()
siempre devuelve 3600000
independientemente de la fecha actual es en invierno/verano.
Parece que solo verifica si esa zona está bajo la administración DST
y si es así, devuelve 3600000
de lo contrario 0
.
¿Es esto un error en getDSTSavings()
?
Si no, entonces la única manera de obtener la corrección actual de DST
en milisegundos es usar la instancia de Calendario como: 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
Sí, eso es lo que estaba buscando. El desplazamiento depende de la zona y el tiempo. Ahora no necesito crear una nueva instancia de calendario en cada tic. En su lugar, solo detecta la zona actual al iniciar el reloj. final TimeZone timeZone = TimeZone.getDefault(); final long utcTime = System.currentTimeMillis(); final long timeOffset = timeZone.getOffset (utcTime); final long t = utcTime + timeOffset; – zlatanmomic