Pregunta

Estoy usando (1.6) bibliotecas de la Joda tiempo y sigue reapareciendo DateTime los objetos con la zona horaria incorrecta, British Summer Time en vez de GMT.

Mi estación de trabajo de Windows (que se ejecuta JDK 1.6.0_16) piensa que es en GMT y si consigo la zona horaria predeterminada de las clases de JDK fecha / hora es correcta (GMT). Me sale el mismo comportamiento en nuestros servidores Linux también. Pensé que podría ser un error en los archivos de base de zona horaria en la Joda así que reconstruyó el frasco con la última base de datos pero sin ningún cambio.

import java.util.TimeZone;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.LocalTime;
import org.joda.time.format.DateTimeFormatter;
import org.joda.time.format.ISODateTimeFormat;

public class TimeZoneTest {

    public static void main(String[] args) {                
        DateTimeFormatter timeParser = ISODateTimeFormat.timeParser();
        TimeZone timeZone = TimeZone.getDefault();
        System.out.println(timeZone.getID()); // "Europe/London"
        System.out.println(timeZone.getDisplayName()); // "Greenwich Mean Time"

        DateTimeZone defaultTimeZone = DateTimeZone.getDefault();
        System.out.println(defaultTimeZone.getID()); //"Europe/London"
        System.out.println(defaultTimeZone.getName(0L)); //"British Summer Time"

        DateTime currentTime = new DateTime();
        DateTimeZone currentZone = currentTime.getZone();
        System.out.println(currentZone.getID()); //"Europe/London"
        System.out.println(currentZone.getName(0L)); //"British Summer Time"            
    }
}

Depuración a través del inicializador estático en org.joda.time.DateTimeZone veo que la llamada System.getProperty("user.timezone") da "Europe/London" como se esperaba.

¿Fue útil?

Solución

Ok, para llegar a la raíz de esto usted tiene que familiarizarse con lo que British Summer Time significa en realidad y cuando estaba en su lugar. Para que sea más corta que pasan a 0L getName() que es por lo 1970-01-01T00:00:00Z DefaultTimeZone busca el nombre de la zona horaria en ese momento. Lo cual era British Summer Time.

  

De: http: // www.nmm.ac.uk/explore/astronomy-and-time/time-facts/british-summer-time

     

En 1968 relojes se adelanta una hora   por delante del GMT el 18 de febrero y   se mantuvo así hasta que British Standard   Tiempo, durante el cual los relojes se mantuvieron en   avance de GMT todo el año, entró en   la fuerza entre el 27 de octubre de 1968 y el 31 de   De octubre de 1971.

Si por el contrario pasaría en la cantidad correcta de milisegundos desde 1970-01-01T00:00:00Z. p.ej. haciendo

defaultTimeZone.getName(new GregorianCalendar().getTimeInMillis())

Se podría obtener la cadena correcta también. Básicamente, usted simplemente harto el método getName() así el parámetro incorrecto terminó con un resultado inesperado.

Si desea comprobar en detalle comprobar los archivos en org/joda/time/tz/src de fuente joda joda para ver cómo determina las zonas de tiempo.


En lugar de

defaultTimeZone.getName(0L)

podría utilizar

defaultTimeZone.toTimeZone().getDisplayName()

, que lo hace por mí.

Otros consejos

Te puede interesar para ver el inicializador estático para la clase DateTimeZone en 1.6:

static {
    setProvider0(null);
    setNameProvider0(null);

    try {
        try {
            cDefault = forID(System.getProperty("user.timezone"));
        } catch (RuntimeException ex) {
            // ignored
        }
        if (cDefault == null) {
            cDefault = forTimeZone(TimeZone.getDefault());
        }
    } catch (IllegalArgumentException ex) {
        // ignored
    }

    if (cDefault == null) {
        cDefault = UTC;
    }
}

Mi conjetura es que usted tiene una propiedad user.timezone definido (y se puso a BST). De lo contrario, parece que Joda debe crear su propia instancia de zona horaria en base a la zona horaria JDK; y yo esperaría que cualquier error en esta área, especialmente la conversión de una zona GMT, habría sido recogido por ahora.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top