Question

J'ai une date stockée comme java.sql.Timestamp dans une base de données. La date est "2010-01-20T19: 10: 35.000Z". Et équivaut à 1264014635743 ms

D'une certaine façon, la date est formatée différemment sur la machine prod par rapport à la machine dev.

Le code pour formater la date est:

private final static String DATE_FORMAT = "yyyy-MM-dd";
public final static SimpleDateFormat APP_DATE_FORMATER = new SimpleDateFormat(DATE_FORMAT);
private static final TimeZone UTC_TIMEZONE = TimeZone.getTimeZone("Etc/UTC");
APP_DATE_FORMATER.setTimeZone(UTC_TIMEZONE);
DateTimeZone.setDefault(DateTimeZone.UTC);

String output = APP_DATE_FORMATER.format(date)

La sortie générée en dev est le bon « 20/01/2010 ». Mais en prod je "2010-01-21", un jour plus tard!

Bien sûr, étant donné que l'erreur se produit sur le serveur de prod, je suis limité dans mes options de débogage ...

Je l'ai vérifié deux fois, et les deux serveurs ont en même temps et le fuseau horaire. Les deux horloge sont synchronisées avec un serveur ntp.


[UPDATE] La base de données prod a la valeur: "01/10/20 19: 10: 35,743000000" pour le champ de date

Était-ce utile?

La solution

Ma première pensée est que c'est une question de concurrence. SimpleDateFormat est pas thread-safe, mais vous partagez une instance statique. Si vous avez besoin d'utiliser de formatteurs java.text dans un environnement multi-thread, vous devez utiliser un ThreadLocal pour les tenir:

private static ThreadLocal<DateFormat> _datetimeFormatter = new ThreadLocal<DateFormat>();

private static DateFormat getDatetimeFormatter()
{
    DateFormat format = _datetimeFormatter.get();
    if (format == null)
    {
        format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
        format.setTimeZone(TimeZone.getTimeZone("GMT"));
        _datetimeFormatter.set(format);
    }
    return format;
}

public static String formatDatetime(Date date)
{
    return getDatetimeFormatter().format(date);
}

Il est également possible (mais peu probable) que « Etc / UTC » ne se trouve pas sur le serveur. Avez-vous vous connectez la valeur de getTimeZone()?

Et la troisième option est, pour paraphraser Inigo Montoya , « vous n'êtes pas en cours d'exécution de la le code que vous pensez que vous exécutez « . Il pourrait être parce que votre code de présentation n'a pas correctement sur le serveur déchargent, ou il y a une autre date formatter flottant autour.

Autres conseils

Alors que les machines ont le même fuseau horaire, que sur les paramètres de base de données? Est-il possible que la base de données est définie sur un fuseau horaire différent de celui de la machine?

Avez-vous vérifié que les paramètres JVM sont les mêmes sur les machines de production et de développement? Les temps peuvent être synchronisés au niveau du serveur, mais peut-être la façon dont la machine virtuelle Java est mis en place est a une certaine confusion quant à ce fuseau horaire il se trouve.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top