SimpleDateFormat dar fecha y la hora equivocada después de algún tiempo de despliegue

Ajay:

Tengo 2 archivos en mi código:

Presentar 1 Contenido:

public static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
public static final SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");

Presentar 2 Contenido:

sdf.format(formatter.parse("2015-02-02")));

Problema: La línea superior en el archivo 2 impresiones "02/02/2015 12:00:00" inicialmente para unas horas, pero después de que se imprima "01/02/2015 06:00:00". ¿Alguna idea de lo que podría ser el problema aquí.

Otros detalles: Mi servidor se ejecuta en una máquina nube se encuentra en los Estados Unidos. new java.util.Date( )da UTC valor de zona horaria correcta todo el tiempo. Servidor se inicia con el comando java -jar xyz.jar. Hay otros archivos que están utilizando sdfy formatterlas variables. Soy incapaz de reproducir esto en la máquina local. Una vez que el tema comienza a suceder en los servidores, que muestra fecha y hora equivocada hasta que se reinicie el servidor.

VV Ole:

Los comentarios de Nathan Hughes y yo son suficientes para ser combinados en una respuesta buena: Uso java.time, la API de fecha y hora moderna, y específicamente su DateTimeFormatter.

public static final DateTimeFormatter printFormatter
        = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");

Ahora su formato puede ir, por ejemplo, así:

    String stringToPrint = LocalDate.parse("2015-02-02")
            .atStartOfDay(ZoneOffset.UTC)
            .format(printFormatter);

    System.out.println(stringToPrint);

Esta impresora:

02/02/2015 00:00:00

En el código de conversión de formato que estoy tomando ventaja del hecho de que su cadena original, 2015-02-02es en el formato estándar ISO 8601 para una fecha. LocalDateanaliza este formato como su defecto, es decir, sin ningún formateador explícita.

Lo que salió mal en el código?

Parecería por su pregunta que hay dos posibles explicaciones para el comportamiento que ha observado:

  1. Una de las otras clases del programa en el servidor que utiliza las dos formateadores, establece la zona horaria de uno de ellos, por ejemplo a América / Chicago.
  2. Dos o más hilos utilizan los formatos de forma simultánea, lo que hace que uno de ellos se comporten de forma incorrecta.

El comportamiento observado, un error de 6 horas, donde después de que haya aparecido, se continúa hasta que se reinicie el servidor, parece más coherente con la primera explicación, que también confirmó en su propia respuesta, y gracias por hacer eso.

Al contrario de SimpleDateFormatlo moderno DateTimeFormatteres seguro para subprocesos, lo que evita cualquier problema de rosca, e inmutable, lo que impide que otras clases de modificar el formateador. Así que los que resuelve su problema en ambos casos.

Como acotación al margen, creo que es consciente de su uso incorrecto de minúsculas hhen la cadena de modelo de formato. hhes para la hora en AM o PM de 01 a 12, mientras que usted necesita mayúscula HHpara la hora del día de 00 a 23 (esto va tanto para el SimpleDateFormatcomo para DateTimeFormatter).

Enlace: Oracle tutorial: Fecha Hora que explica cómo utilizar java.time.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=205635&siteId=1
Recomendado
Clasificación