Conversión de fecha a cadena de tiempo una hora incorrecta

Tengo una fecha, por ejemplo. 2000-01-01T10:00:00Z . Esto significa horario de apertura de una tienda, lo que significa que la tienda abre a las 10 en punto. La otra información es inútil, es una fecha aleatoria. Solo necesito representar esto como una cadena, así que: 10:00. Para esta conversión utilicé un método simple:

public String dateToString(Date date){
    SimpleDateFormat ft =  new SimpleDateFormat ("HH:mm");
    String time= ft.format(date);
return time;
}

Pensé que esto debería funcionar, la capital HH para la representación de las horas de 24 horas. ¡Pero cuando ejecuto este código, el valor de retorno es 11:00! ¿Por qué es esto y cómo prevenirlo? ¿La función de formato analiza mi zona horaria y está configurada incorrectamente en la Fecha (creo que la configuración de mi teléfono es mgt+1, porque vivo en Holanda)? ¿Y cómo ignorar esto?

preguntado el 28 de julio de 12 a las 21:07

Z significa GMT+0, así que sí, zona horaria incorrecta. -

De alguna manera tuve el mismo problema en Irán. Cuando deshabilito el horario de verano en mi sistema operativo (mediante el uso de una zona horaria que no admite el horario de verano), ¡todo sale bien! -

@AmirPashazadeh Cambiar la zona horaria predeterminada en su sistema operativo host no es la mejor manera de hacerlo. En su lugar, (a) use las clases java.time y (b) siempre especifique los argumentos de zona horaria opcionales en los diversos métodos en las clases de fecha y hora. -

2 Respuestas

ok, lo encontre! Android conversa una Fecha a la zona horaria del dispositivo. Tuve que anular eso:

Esto funciona:

public String dateToString(Date date){
    SimpleDateFormat ft =  new SimpleDateFormat ("HH:mm");
    ft.setTimeZone(TimeZone.getTimeZone("UTC"));
    String time= ft.format(date);
return time;
}

Respondido 29 Jul 12, 08:07

El valor 2000-01-01T10:00:00Z no es para nada “inútil”. Esto describe un momento exacto en la línea de tiempo, con una fecha, una hora del día y un desplazamiento-de-UTC cual es UTC mismo en este caso.

ISO 8601

Ese formato de cadena está definido por el ISO 8601 estándar. La Z al final es corto para Zulu y significa UTC.

Instant

Puede analizar esta cadena directamente como un Instant. Instant la clase representa un momento en la línea de tiempo en UTC con una resolución de nanosegundos. Eso significa hasta nueve (9) dígitos de una fracción decimal.

Instant instant = Instant.parse( "2000-01-01T10:00:00Z" );

Los programas Instant class es solo la clase de bloque de construcción básica en Java. Para mayor flexibilidad deberíamos:

  • Asigne al instante un desplazamiento desde UTC (ZoneOffset) para obtener un OffsetDateTime.
  • Asigne al instante una zona horaria (ZoneId) conseguir un ZonedDateTime.

¿Cuál es la diferencia? Una zona horaria es un desplazamiento y también un conjunto de reglas para manejar anomalías como Horario de verano (DST).

OffsetDateTime

Entonces, si realmente quería la hora del día para este momento como se ve en UTC, entonces asigne un desplazamiento de UTC (ZoneOffset.UTC) para obtener un OffsetDateTimey, a continuación, extraiga un LocalTime objeto. LocalTime representa una hora del día sin fecha y sin zona horaria.

OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );
LocalTime lt = odt.toLocalTime();  // 10:00:00

ZonedDateTime

Si desea ver el mismo momento a través de la lente de otra zona horaria, para ver la región en particular hora del reloj de pared, especifique un ZoneId. Por ejemplo, ese mismo momento en Québec serían 5 horas detrás de UTC.

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );  // 2000-01-01T05:00:00-05:00[America/Montreal]
LocalTime lt = zdt.toLocalTime();  // 05:00:00

Acerca de java.time

Los programas java.tiempo framework está integrado en Java 8 y versiones posteriores. Estas clases suplantan las problemáticas clases de fecha y hora antiguas, como java.util.Date, .CalendarY java.text.SimpleDateFormat.

Los programas Joda-Tiempo proyecto, ahora en modo de mantenimiento, aconseja la migración a java.time.

Para obtener más información, consulte el Tutorial de Oracle. Y busque Stack Overflow para obtener muchos ejemplos y explicaciones.

Gran parte de la funcionalidad de java.time está retroportada a Java 6 y 7 en ThreeTen-Backport y más adaptado a Android in TresDiezABP (consulte la sección del Cómo utilizar…).

Los programas ThreeTen-Extra El proyecto extiende java.time con clases adicionales. Este proyecto es un campo de pruebas para posibles adiciones futuras a java.time.

contestado el 23 de mayo de 17 a las 11:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.