2010-11-08 6 views
8

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

  1. UTC en milisegundos, que puedo conseguir con System.currentTimeMillis()
  2. zona horaria compensar
  3. 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 

Respuesta

12

Aquí es un ejemplo de cómo se utiliza el horario de verano:

TimeZone london = TimeZone.getTimeZone("Europe/London"); 
System.out.println(london.getOffset(date.getTime())); 

Esto imprimirá 3600000 Si el horario de verano está en vigor en Londres en la fecha especificada. De lo contrario, imprimirá 0.

+3

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

2

La instancia de cal1 que recupera en la primera línea está en GMT + 1 y eso no cambia independientemente de la hora/fecha que configuró. Si necesita verificar la zona horaria actual en cada tic del reloj, tendrá que recuperar una nueva instancia de calendario en cada tic.

Como nota adicional, si está dispuesto a agregar una dependencia a su proyecto, Joda Time es una maravillosa biblioteca de fecha y hora.

Cuestiones relacionadas