Como establecer la zona horaria de java.útil.¿Cita?
He analizado un java.util.Date
desde un String
pero está configurando la zona horaria local como la zona horaria del objeto date
.
La zona horaria no se especifica en el String
desde el que se analiza Date
. Quiero establecer una zona horaria específica del objeto date
.
¿Cómo puedo hacer eso?
8 answers
Utilice el formato de datos. 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");
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-08 13:22:33
Tenga en cuenta que los objetos java.util.Date
no contienen ninguna información de zona horaria por sí mismos; no puede establecer la zona horaria en un objeto Date
. Lo único que contiene un objeto Date
es un número de milisegundos desde la "época" - 1 de enero de 1970, 00:00:00 UTC.
Como muestra el Codificador ZZ, usted establece la zona horaria en el objeto DateFormat
, para indicarle en qué zona horaria desea mostrar la fecha y la hora.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-23 14:45:21
Tl; dr
Par parsed from from a String not time zone is not specified want I want to set a specific time zone{[48]]}
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.
No Hay zona horaria en la Fecha j.u.
Como las otras respuestas correctas declararon, un java.útil.La fecha no tiene zona horaria†. Representa UTC/GMT (sin desplazamiento de zona horaria). Muy confuso porque su método toString
aplica la zona horaria predeterminada de la JVM al generar una representación de cadena.
Evite j.u.Date
Para esta y muchas otras razones, debe evitar el uso de Java incorporado.útil.Fecha & .Calendar & java.texto.Formato simple. Son notoriamente problemáticos.
En su lugar use el java.time package incluido con Java 8.
Java.time
El java.las clases de tiempo pueden representar un momento en la línea de tiempo de tres maneras:
- UTC (
Instant
) - Con un desplazamiento (
OffsetDateTime
conZoneOffset
) - Con una zona horaria (
ZonedDateTime
conZoneId
)
Instant
En java.time , el bloque de construcción básico es Instant
, un momento en la línea de tiempo en UTC. Utilice objetos Instant
para gran parte de su lógica de negocio.
Instant instant = Instant.now();
OffsetDateTime
Aplique un offset-from-UTCpara ajustarse 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 , un desplazamiento más las reglas para manejar anomalías como El horario de verano (DST).
Aplicar un ZoneId
a un Instant
para obtener un ZonedDateTime
. Siempre especifique un nombre de zona horaria . Nunca use 3-4 abreviaturas como EST
o IST
que no sean únicas ni estandarizadas.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
LocalDateTime
Si la cadena de entrada carecía de cualquier indicador de desplazamiento o zona, analizar como un LocalDateTime
.
Si están seguros de la zona horaria prevista, asignar un ZoneId
para producir un ZonedDateTime
. Vea el ejemplo de código anterior en la sección tl;dr en la parte superior.
Cadenas formateadas
Llame al método 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. La clase ZonedDateTime
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. Generalmente es mejor dejar que esa clase genere formatos localizados usando el lenguaje humano esperado del usuario y las normas culturales. O puede especificar un formato particular.
Acerca de java.time
El java.hora el framework está integrado en Java 8 y versiones posteriores. Estas clases suplantan a las problemáticas antiguas legacy clases de fecha y hora como java.util.Date
, Calendar
, & SimpleDateFormat
.
El Joda-Tiempo project, ahora en modo de mantenimiento , aconseja la migración a java .time classes.
Para obtener más información, consulte el Oracle Tutorial. Y desbordamiento de pila de búsqueda para muchos ejemplos y explicaciones. La especificación es JSR 310.
Puede intercambiar java.time objetos directamente con su base de datos. Utilice un controlador JDBC compatible con JDBC 4.2 o posterior. No hay necesidad para cadenas, no hay necesidad de clases java.sql.*
.
Dónde obtener el java.clases de tiempo?
-
Java SE 8, Java SE 9, Java SE 10, Java SE 11, y más adelante, Parte de la norma API de Java con un paquete de implementación.
- Java 9 añade algunas características menores y correcciones.
-
Java SE 6 y Java SE 7
- La mayor parte de java.la funcionalidad de tiempo se vuelve a portar a Java 6 y 7 en ThreeTen-Backport.
-
Android
- Versiones posteriores de implementaciones de Android bundle de java .time classes.
- Para versiones anteriores de Android (ThreeTenABP el proyecto se adapta ThreeTen-Backport (mencionado anteriormente). Véase Cómo usar ThreeTenABP....
El ThreeTen-Extra el proyecto extiende java.tiempo con clases adicionales. Este proyecto es un campo de pruebas para posibles adiciones futuras a Java.tiempo. Usted puede encontrar algunos de clases útiles aquí, tales como Interval
, YearWeek
, YearQuarter
, y más.
Joda-Tiempo
Mientras que Joda-Time está todavía mantenido activamente, sus creadores nos han dicho que migremos a Java.tiempo tan pronto como sea conveniente. Dejo esta sección intacta como referencia, pero sugiero usar la sección java.time
anterior en su lugar.
En Joda-Time , un objeto fecha-hora(DateTime
) realmente sabe 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 al método toString
para generar una cadena en formato ISO 8601 .
String output = dateTimeIndia.toString();
Joda-Time también ofrece ricas capacidades para generar todo tipo de otros formatos de cadena.
Si es necesario, puede convertir de Joda-Time DateTime a java.útil.Fecha.
Java.util.Date date = dateTimeIndia.toDate();
Busque en StackOverflow "joda date" para encontrar muchos más ejemplos, algunos bastante detallados.
†En realidad, es una zona horaria incrustada en un java.útil.Fecha, utilizada para algunas funciones internas (ver comentarios sobre esta respuesta). Pero esta zona horaria interna no se expone como una propiedad y no se puede establecer. Esta zona horaria interna es no la utilizada por el toString
método para generar una representación de cadena del valor fecha-hora; en su lugar, la zona horaria predeterminada actual de la JVM se aplica sobre la marcha. Entonces, como abreviatura, a menudo decimos "j. u. Date no tiene zona horaria". Confuso? Sí. Otra razón más para evitar estas viejas clases cansadas.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-29 19:11:32
También puede establecer la zona horaria en el nivel JVM
Date date1 = new Date();
System.out.println(date1);
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
// or pass in a command line arg: -Duser.timezone="UTC"
Date date2 = new Date();
System.out.println(date2);
Salida:
Thu Sep 05 10:11:12 EDT 2013
Thu Sep 05 14:11:12 UTC 2013
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-08 13:23:55
java.util.Calendar
es la forma habitual de manejar zonas horarias usando solo clases JDK. Apache Commons tiene otras alternativas/utilidades que pueden ser útiles. Editar La nota de Spong me recordó que he escuchado cosas muy buenas sobre Joda-Time (aunque yo no lo he usado).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-02 10:30:43
Si debe trabajar solo con clases JDK estándar, puede usar esto:
/**
* Converts the given <code>date</code> from the <code>fromTimeZone</code> to the
* <code>toTimeZone</code>. Since java.util.Date has does not really store time zome
* information, this actually converts the date to the date that it would be in the
* other time zone.
* @param date
* @param fromTimeZone
* @param toTimeZone
* @return
*/
public static Date convertTimeZone(Date date, TimeZone fromTimeZone, TimeZone toTimeZone)
{
long fromTimeZoneOffset = getTimeZoneUTCAndDSTOffset(date, fromTimeZone);
long toTimeZoneOffset = getTimeZoneUTCAndDSTOffset(date, toTimeZone);
return new Date(date.getTime() + (toTimeZoneOffset - fromTimeZoneOffset));
}
/**
* Calculates the offset of the <code>timeZone</code> from UTC, factoring in any
* additional offset due to the time zone being in daylight savings time as of
* the given <code>date</code>.
* @param date
* @param timeZone
* @return
*/
private static long getTimeZoneUTCAndDSTOffset(Date date, TimeZone timeZone)
{
long timeZoneDSTOffset = 0;
if(timeZone.inDaylightTime(date))
{
timeZoneDSTOffset = timeZone.getDSTSavings();
}
return timeZone.getRawOffset() + timeZoneDSTOffset;
}
El crédito va a este post.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-22 18:37:00
Si alguien alguna vez necesita esto, si necesita convertir una zona horaria XMLGregorianCalendar
a su zona horaria actual desde UTC, entonces todo lo que necesita hacer es establecer la zona horaria en 0
, luego llame a toGregorianCalendar()
- se mantendrá la misma zona horaria, pero el Date
sabe cómo convertirla a la suya, para que pueda obtener los datos desde allí.
XMLGregorianCalendar xmlStartTime = DatatypeFactory.newInstance()
.newXMLGregorianCalendar(
((GregorianCalendar)GregorianCalendar.getInstance());
xmlStartTime.setTimezone(0);
GregorianCalendar startCalendar = xmlStartTime.toGregorianCalendar();
Date startDate = startCalendar.getTime();
XMLGregorianCalendar xmlStartTime = DatatypeFactory.newInstance()
.newXMLGregorianCalendar(startCalendar);
xmlStartTime.setHour(startDate.getHours());
xmlStartTime.setDay(startDate.getDate());
xmlStartTime.setMinute(startDate.getMinutes());
xmlStartTime.setMonth(startDate.getMonth()+1);
xmlStartTime.setTimezone(-startDate.getTimezoneOffset());
xmlStartTime.setSecond(startDate.getSeconds());
xmlStartTime.setYear(startDate.getYear() + 1900);
System.out.println(xmlStartTime.toString());
Resultado:
2015-08-26T12:02:27.183Z
2015-08-26T14:02:27.183+02:00
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-08 13:22:07
Convierta la fecha en Cadena y hágalo con SimpleDateFormat.
SimpleDateFormat readFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
readFormat.setTimeZone(TimeZone.getTimeZone("GMT" + timezoneOffset));
String dateStr = readFormat.format(date);
SimpleDateFormat writeFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
Date date = writeFormat.parse(dateStr);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-18 19:31:59