Pergunta

Eu tenho uma data armazenada como um java.sql.timestamp em um banco de dados. A data é "2010-01-20T19: 10: 35.000Z" e é equivalente a 1264014635743 ms.

De alguma forma, a data é formatada de maneira diferente na máquina Prod em comparação com a máquina dev.

O código para formatar a data é:

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)

A saída gerada no Dev é a correta "2010-01-20". Mas no Prod eu tenho "2010-01-21", um dia depois!

Obviamente, como o erro ocorre no servidor Prod, estou limitado nas minhas opções de depuração ...

Eu verifiquei duas vezes e os dois servidores têm o mesmo tempo e fuso horário. Ambos os relógios são sincronizados com um servidor NTP.


Atualização] O banco de dados no Prod tem o valor: "10-01-20 19: 10: 35.743000000" para o campo Data

Foi útil?

Solução

Meu primeiro pensamento é que essa é uma questão de simultaneidade. SimpleDateFormat é não Seguro, mas você está compartilhando uma instância estática. Se você precisar usar java.text Formatatos em um ambiente multithread, você deve usar um Threadlocal para segurá-los:

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);
}

Também é possível (mas improvável) que "etc/utc" não seja encontrado no servidor. Você registra o valor de getTimeZone()?

E a terceira opção é parafrasear Inigo Montoya, "Você não está executando o código que acha que está executando". Pode ser porque seu código de apresentação não descarrega corretamente no servidor ou há outro formatador de data flutuando.

Outras dicas

Enquanto as máquinas têm o mesmo fuso horário, e as configurações de banco de dados? É possível que o banco de dados esteja definido para um fuso horário diferente da máquina?

Você verificou se as configurações da JVM são as mesmas nas máquinas de produção e desenvolvimento? Os tempos podem estar sincronizados no nível do servidor, mas talvez a maneira como a JVM é configurada seja uma confusão sobre em que fuso horário está.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top