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?

Author: Matt Johnson, 2010-05-23

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");
 252
Author: ZZ Coder,
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.

 137
Author: Jesper,
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 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. 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 toStringen 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?

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.

 61
Author: Basil Bourque,
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
 60
Author: starmer,
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).

 6
Author: T.J. Crowder,
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.

 6
Author: diadyne,
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
 0
Author: EpicPandaForce,
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);
 0
Author: avisper,
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