Saltar al contenido

¿Cómo establecer la zona horaria de un java.util.Date?

Te damos la bienvenida a nuestra página web, en este sitio vas a encontrar la solucíon que estás buscando.

Solución:

Utilice DateFormat. Por ejemplo,

SimpleDateFormat isoFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
isoFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = isoFormat.parse("2010-05-23T09:01:02");

Sé consciente de java.util.Date los objetos no contienen ninguna información de zona horaria por sí mismos; no puede establecer la zona horaria en un Date objeto. Lo único que un Date El objeto contiene es un número de milisegundos desde la “época” – 1 de enero de 1970, 00:00:00 UTC.

Como muestra ZZ Coder, configura la zona horaria en el DateFormat objeto, para indicarle en qué zona horaria desea mostrar la fecha y la hora.

tl; dr

… analizado … de una cadena … la zona horaria no está especificada … Quiero establecer una zona horaria específica

LocalDateTime.parse( "2018-01-23T01:23:45.123456789" )  // Parse string, lacking an offset-from-UTC and lacking a time zone, as a `LocalDateTime`.
    .atZone( ZoneId.of( "Africa/Tunis" ) )              // Assign the time zone for which you are certain this date-time was intended. Instantiates a `ZonedDateTime` object.

Sin zona horaria en juDate

Como se indica en las otras respuestas correctas, un java.util.Date no tiene zona horaria. Representa UTC / GMT (sin compensación de zona horaria). Muy confuso porque es toString El método aplica la zona horaria predeterminada de la JVM al generar una representación de cadena.

Evite juDate

Por esta y muchas otras razones, debe evitar el uso de java.util.Date & .Calendar & java.text.SimpleDateFormat integrados. Son notoriamente problemáticos.

En su lugar, utilice el paquete java.time incluido con Java 8.

java.time

Las clases java.time pueden representar un momento en la línea de tiempo de tres formas:

  • UTC (Instant)
  • Con un desplazamiento (OffsetDateTime con ZoneOffset)
  • Con una zona horaria (ZonedDateTime con ZoneId)

Instant

En java.time, el bloque de construcción básico es Instant, un momento en la línea de tiempo en UTC. Usar Instant objetos para gran parte de su lógica empresarial.

Instant instant = Instant.now();

OffsetDateTime

Aplique un desplazamiento de UTC para ajustarlo a la hora del reloj de pared de alguna localidad.

Aplicar una ZoneOffset para conseguir un OffsetDateTime.

ZoneOffset zoneOffset = ZoneOffset.of( "-04:00" );
OffsetDateTime odt = OffsetDateTime.ofInstant( instant , zoneOffset );

ZonedDateTime

Mejor es aplicar una zona horaria, una compensación más las reglas para manejar anomalías como el horario de verano (DST).

Aplicar una ZoneId a una Instant conseguir un ZonedDateTime. Siempre especifique un nombre de zona horaria adecuado. Nunca use 3-4 abreviaturas como EST o IST que no son únicos ni estandarizados.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

LocalDateTime

Si la entrada string carecía de cualquier indicador de compensación o zona, analizar como un LocalDateTime.

Si está seguro de la zona horaria prevista, asigne un ZoneId para producir un ZonedDateTime. Ver ejemplo de código arriba en tl; dr sección en la parte superior.

Cadenas formateadas

Llama a toString en cualquiera de estas tres clases para generar una cadena que represente el valor de fecha y hora en el formato estándar ISO 8601. los ZonedDateTime La clase amplía el formato estándar añadiendo el nombre de la zona horaria entre paréntesis.

String outputInstant = instant.toString(); // Ex: 2011-12-03T10:15:30Z
String outputOdt = odt.toString(); // Ex: 2007-12-03T10:15:30+01:00
String outputZdt = zdt.toString(); // Ex: 2007-12-03T10:15:30+01:00[Europe/Paris]

Para otros formatos use el DateTimeFormatter clase. Por lo general, es mejor dejar que esa clase genere formatos localizados utilizando el lenguaje humano y las normas culturales esperadas del usuario. O puede especificar un formato particular.


Tabla de todos los tipos de fecha y hora en Java, tanto modernos como heredados


Sobre java.time

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

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

los Joda-Time proyecto, ahora en modo de mantenimiento, aconseja la migración a las clases java.time.

Puedes intercambiar java.time objetos directamente con su base de datos. Utilice un controlador JDBC compatible con JDBC 4.2 o posterior. Sin necesidad de cuerdas, sin necesidad de java.sql.* clases. Compatibilidad con Hibernate 5 y JPA 2.2 java.time.

¿Dónde obtener las clases java.time?

  • Java SE 8, Java SE 9, Java SE 10, Java SE 11y posterior: parte de la API estándar de Java con una implementación integrada.
    • Java 9 trajo algunas características menores y correcciones.
  • Java SE 6 y Java SE 7
    • La mayoría de java.time la funcionalidad está respaldada a Java 6 y 7 en ThreeTen-Backport.
  • Androide
    • Versiones posteriores de implementaciones de paquetes de Android (26+) del java.time clases.
    • Para Android anterior (<26), un proceso conocido como API desugaring trae un subconjunto del java.time funcionalidad no incorporada originalmente en Android.
      • Si el desugaring no ofrece lo que necesita, el ThreeTenABP el proyecto se adapta ThreeTen-Backport (mencionado anteriormente) a Android. Ver Cómo usar ThreeTenABP….

Joda-Time

Si bien Joda-Time todavía se mantiene activamente, sus creadores nos han dicho que migremos a java.time tan pronto como sea conveniente. Dejo esta sección intacta como referencia, pero sugiero usar la java.time sección anterior en su lugar.

En Joda-Time, un objeto de fecha y hora (DateTime) realmente conoce su zona horaria asignada. Eso significa un desplazamiento de UTC y las reglas y el historial del horario de verano (DST) de esa zona horaria y otras anomalías similares.

String input = "2014-01-02T03:04:05";
DateTimeZone timeZone = DateTimeZone.forID( "Asia/Kolkata" );
DateTime dateTimeIndia = new DateTime( input, timeZone );
DateTime dateTimeUtcGmt = dateTimeIndia.withZone( DateTimeZone.UTC );

Llama a toString método para generar una cadena en formato ISO 8601.

String output = dateTimeIndia.toString();

Joda-Time también ofrece amplias capacidades para generar todo tipo de otros formatos de cadenas.

Si es necesario, puede convertir de Joda-Time DateTime a java.util.Date.

Java.util.Date date = dateTimeIndia.toDate();

Busque en StackOverflow “joda date” para encontrar muchos más ejemplos, algunos bastante detallados.


En realidad hay es una zona horaria incrustada en un java.util.Date, que se utiliza para algunas funciones internas (consulte los comentarios de esta respuesta). Pero esta zona horaria interna no se expone como una propiedad y no se puede establecer. Esta zona horaria interna es no el usado por el toString método para generar un string representación del valor de fecha y hora; en su lugar, la zona horaria predeterminada actual de la JVM se aplica sobre la marcha. Entonces, como abreviatura, a menudo decimos “juDate no tiene zona horaria”. ¿Confuso? Si. Otra razón más para evitar estas viejas clases cansadas.

No se te olvide compartir esta reseña si te ayudó.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *