He analizado a java.util.Date
desde a String
pero establece la zona horaria local como la zona horaria del date
objeto.
La zona horaria no se especifica en el String
que Date
se analiza. Quiero establecer una zona horaria específica del date
objeto.
¿Cómo puedo hacer eso?
java
date
timezone
java.util.date
Yatendra Goel
fuente
fuente
Respuestas:
Utilice DateFormat. Por ejemplo,
fuente
TimeZone.setDefault()
antes de llamargetTime()
para que el nuevo objeto de fecha esté en la zona horaria que desee. En JDK 1.8,Calendar.getTime()
llamadasreturn new Date(getTimeInMillis());
.Tenga en cuenta que los
java.util.Date
objetos no contienen ninguna información de zona horaria por sí mismos: no puede establecer la zona horaria en unDate
objeto. Lo único queDate
contiene un objeto es una cantidad de milisegundos desde la "época" - 1 de enero de 1970, 00:00:00 UTC.Como muestra ZZ Coder, establece la zona horaria en el
DateFormat
objeto, para indicarle en qué zona horaria desea mostrar la fecha y la hora.fuente
long
campo llamadofastTime
.Date.toString()
en realidad usa unCalendar
para interpretar este milisegundo de tiempo. Por lo tanto, imprimir unDate
archivo parece tener una zona horaria (predeterminada), lo que genera preguntas comprensibles sobre cómo configurar esa zona horaria.tl; dr
Sin zona horaria en juDate
Como indicaron las otras respuestas correctas, un java.util.Date no tiene zona horaria † . Representa UTC / GMT (sin desplazamiento de zona horaria). Muy confuso porque su
toString
método aplica la zona horaria predeterminada de la JVM al generar una representación de cadena.Evite el juDate
Por esta y muchas otras razones, debe evitar usar el java.util.Date & .Calendar & java.text.SimpleDateFormat incorporado. Son notoriamente problemáticos.
En su lugar, use 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 maneras:
Instant
)OffsetDateTime
conZoneOffset
)ZonedDateTime
conZoneId
)Instant
En java.time , el elemento básico es
Instant
un momento en la línea de tiempo en UTC. UseInstant
objetos para gran parte de su lógica empresarial.OffsetDateTime
Aplique un desplazamiento desde UTC para ajustar la hora del reloj de pared de alguna localidad .
Aplica un
ZoneOffset
para obtener unOffsetDateTime
.ZonedDateTime
Es mejor aplicar una zona horaria , un desplazamiento más las reglas para manejar anomalías como el horario de verano (DST) .
Aplica una
ZoneId
a unaInstant
para obtener unaZonedDateTime
. Siempre especifique un nombre de zona horaria adecuado . Nunca use 3-4 abreviaturas comoEST
oIST
que no sean únicas ni estandarizadas.LocalDateTime
Si la cadena de entrada carecía de algún indicador de desplazamiento o zona, analice como a
LocalDateTime
.Si está seguro de la zona horaria prevista, asigne a
ZoneId
para producir aZonedDateTime
. Vea el ejemplo de código anterior en la sección tl; dr en la parte superior.Cadenas formateadas
Llame al
toString
método 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 . LaZonedDateTime
clase extiende el formato estándar agregando el nombre de la zona horaria entre paréntesis.Para otros formatos, use la
DateTimeFormatter
clase. En general, es mejor dejar que esa clase genere formatos localizados utilizando el lenguaje humano y las normas culturales esperadas por el usuario. O puede especificar un formato particular.Sobre java.time
El marco java.time está integrado en Java 8 y versiones posteriores. Estas clases suplantar la vieja problemáticos heredados clases de fecha y hora como
java.util.Date
,Calendar
, ySimpleDateFormat
.El proyecto Joda-Time , ahora en modo de mantenimiento , aconseja la migración a las clases java.time .
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 .
Puede intercambiar objetos java.time directamente con su base de datos. Utilice un controlador JDBC compatible con JDBC 4.2 o posterior. No hay necesidad de cadenas, no hay necesidad de
java.sql.*
clases.¿Dónde obtener las clases java.time?
El proyecto ThreeTen-Extra extiende java.time con clases adicionales. Este proyecto es un campo de pruebas para posibles adiciones futuras a java.time. Usted puede encontrar algunas clases útiles aquí, como
Interval
,YearWeek
,YearQuarter
, y más .Joda-Time
Si bien Joda-Time aún 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 una compensación de UTC y las reglas y el historial del horario de verano de esa zona horaria (DST) y otras anomalías similares.Llame al
toString
método para generar una cadena en formato ISO 8601 .Joda-Time también ofrece capacidades ricas para generar todo tipo de otros formatos de cadena.
Si es necesario, puede convertir de Joda-Time DateTime a java.util.Date.
Busque StackOverflow para "joda date" para encontrar muchos más ejemplos, algunos bastante detallados.
† En realidad no es una zona horaria incrustada en un java.util.Date, que se utiliza para algunas funciones internas (véanse los comentarios sobre esta respuesta). Pero esta zona horaria interna no está expuesta como una propiedad y no se puede establecer. Esta zona horaria interna no es la utilizada por el
toString
método para generar una representación de cadena del valor de fecha y hora; en cambio, la zona horaria predeterminada actual de la JVM se aplica sobre la marcha. Entonces, como taquigrafía, a menudo decimos "juDate no tiene zona horaria". ¿Confuso? Si. Otra razón más para evitar estas viejas clases cansadas.fuente
BaseCalendar.Date cdate
propiedad si se establece. Echa un vistazo al código fuente aquí . No puede establecer la zona horaria de un objeto juDate excepto cambiando la zona horaria predeterminada de la JVM llamandoTimeZone.setDefault(TimeZone.getTimeZone("NEW_TIME_ZONE"));
. Por lo tanto, hay un desplazamiento de zona horaria y puede obtener el desplazamiento llamando al método obsoleto juDate.getTimezoneOffset ()toString
método que aplica la zona horaria predeterminada actual de la JVM; nuevamente ignorando la zona horaria enterrada. Entonces, por brevedad, decimos que java.util.Date no tiene zona horaria. Como el arte , es una mentira que dice la verdad.TimeZone.setDefault
, se le no ajustar el huso horario del objeto java.util.Date - el objeto Date sigue haciendo caso omiso de su zona de tiempo enterrada, actuando efectivamente en UTC. Afectaría eltoString
método de Date . La configuración predeterminada cambia la zona horaria predeterminada de la JVM, que generalmente se establece en la zona horaria del sistema operativo host. Esa llamada no se recomienda ya que afecta todo el código en todos los hilos de todas las aplicaciones que se ejecutan en esa JVM, y lo hace sobre la marcha mientras se ejecutan. Siendo grosero y peligroso, esa llamada solo debe considerarse como un último recurso.equals
,hashcode
,getTime
..) Si se echa un vistazo en elequals
método, se llama agetTime()
la cual las llamadasgetTimeImpl()
, que las llamadasnormalize()
si elcdate
inmueble no se normaliza. En elnormalize()
método, la última condición if vuelve a calcular los milisegundos desde 1/1/70 en función de su información de zona horaria almacenada si la zona horaria decdate
es diferente de la zona horaria del entorno JVM actual en el que se está ejecutando. (Echa un vistazo asun.util.calendar.AbstractCalendar getCalendarDate(long millis, CalendarDate date)
)También puede establecer la zona horaria en el nivel JVM
salida:
fuente
TimeZone.setDefault
son bastante drásticas, ya que afectan a toda la JVM, afectan a todos los demás objetos y subprocesos. Consulte esta respuesta para obtener detalles que incluyen incluso más complicaciones si está ejecutando con un SecurityManager. Agregando aún más complicaciones: este comportamiento ha cambiado en varias versiones de Java, como se discutió en esta pregunta .Si debe trabajar solo con clases JDK estándar, puede usar esto:
El crédito va a esta publicación .
fuente
java.util.Calendar
es la forma habitual de manejar zonas horarias usando solo clases JDK. Apache Commons tiene algunas alternativas / utilidades adicionales que pueden ser útiles. Editar la nota de Spong me recordó que he escuchado cosas realmente buenas sobre Joda-Time (aunque no lo he usado yo mismo).fuente
Period
,Duration
yInterval
. Esos vanos incluyen métodos de comparación tales comocontains
,abuts
,overlap
, ygap
. YPeriodFormatterBuilder
puede construir frases descriptivas como "15 años y 8 meses".Convierta la fecha en cadena y hágalo con SimpleDateFormat.
fuente
Si alguien alguna vez necesita esto, si necesita convertir una
XMLGregorianCalendar
zona horaria a su zona horaria actual desde UTC, entonces todo lo que necesita hacer es configurar la zona horaria0
, luego llamartoGregorianCalendar()
: permanecerá en la misma zona horaria, peroDate
sabe cómo convertirla a el suyo, para que pueda obtener los datos desde allí.Resultado:
fuente
Este código fue útil en una aplicación en la que estoy trabajando:
fuente