zona obtener horaria hora actual java date gmt

horaria - obtener hora actual java



Obtenga tiempo GMT en Java (8)

En Java, quiero obtener la hora actual en GMT.

Intenté varias opciones como esta:

Date date = new Date(); Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT")); date1 = calendar.getTime();

Pero la fecha siempre se interpreta en mi zona horaria local.

¿Qué estoy haciendo mal y cómo puedo convertir una fecha de Java en GMT?


Las probabilidades son buenas. Hiciste lo correcto al final para obtener la fecha, pero no hay nada que indique que no tomaste esa hora GMT y la formateaste de acuerdo con la configuración regional actual de tu máquina.

final Date currentTime = new Date(); final SimpleDateFormat sdf = new SimpleDateFormat("EEE, MMM d, yyyy hh:mm:ss a z"); // Give it to me in GMT time. sdf.setTimeZone(TimeZone.getTimeZone("GMT")); System.out.println("GMT time: " + sdf.format(currentTime));

La clave es usar su propio DateFormat, no el sistema proporcionado. De esta forma, puede configurar la zona horaria de DateFormat a su gusto, en lugar de establecerla en la zona horaria de la configuración regional.


Para obtener el tiempo en millis en GMT todo lo que necesita es

long millis = System.currentTimeMillis();

También puedes hacer

long millis = new Date().getTime();

y

long millis = Calendar.getInstance(TimeZone.getTimeZone("GMT")).getTimeInMillis();

pero estas son formas ineficientes de hacer la misma llamada.


Según mi experiencia, las clases combinadas de Calendario y Fecha en Java pueden producir un efecto desaprovechado. Si no le importa actualizar a Java 8, considere usar ZonedDateTime

al igual que:

ZonedDateTime currentDate = ZonedDateTime.now( ZoneOffset.UTC );


Después de probar muchos métodos, descubrí que, para obtener el tiempo en millis en GMT, necesita crear dos objetos SimpleDateFormat separados, uno para formatear en GMT y otro para analizar.

Aquí está el código:

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); format.setTimeZone(TimeZone.getTimeZone("UTC")); Date date = new Date(); SimpleDateFormat dateParser = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date dateTime= dateParser.parse(format.format(date)); long gmtMilliSeconds = dateTime.getTime();

Esto funciona bien :)


Me pregunto por qué nadie hace esto:

Calendar time = Calendar.getInstance(); time.add(Calendar.MILLISECOND, -time.getTimeZone().getOffset(time.getTimeInMillis())); Date date = time.getTime();


Esto es bastante simple y directo.

Date date = new Date(); TimeZone.setDefault(TimeZone.getTimeZone("GMT")); Calendar cal = Calendar.getInstance(TimeZone.getDefault()); date = cal.getTime();

Ahora la fecha contendrá la hora GMT actual.


Métodos útiles de Utils como se indica a continuación para administrar el tiempo en GMT con ahorro de DST:

public static Date convertToGmt(Date date) { TimeZone tz = TimeZone.getDefault(); Date ret = new Date(date.getTime() - tz.getRawOffset()); // if we are now in DST, back off by the delta. Note that we are checking the GMT date, this is the KEY. if (tz.inDaylightTime(ret)) { Date dstDate = new Date(ret.getTime() - tz.getDSTSavings()); // check to make sure we have not crossed back into standard time // this happens when we are on the cusp of DST (7pm the day before the change for PDT) if (tz.inDaylightTime(dstDate)) { ret = dstDate; } } return ret; } public static Date convertFromGmt(Date date) { TimeZone tz = TimeZone.getDefault(); Date ret = new Date(date.getTime() + tz.getRawOffset()); // if we are now in DST, back off by the delta. Note that we are checking the GMT date, this is the KEY. if (tz.inDaylightTime(ret)) { Date dstDate = new Date(ret.getTime() + tz.getDSTSavings()); // check to make sure we have not crossed back into standard time // this happens when we are on the cusp of DST (7pm the day before the change for PDT) if (tz.inDaylightTime(dstDate)) { ret = dstDate; } } return ret; }


tl; dr

Instant.now()

java.time

La respuesta de Damilola es correcta al sugerirle que utilice el marco java.time integrado en Java 8 y posterior. Pero esa respuesta utiliza la clase ZonedDateTime , que es excesiva si solo desea UTC en lugar de cualquier zona horaria en particular.

Las antiguas clases problemáticas de fecha y hora ahora son heredadas, suplantadas por las clases de java.time.

Instant

La clase Instant representa un momento en la línea de tiempo en UTC con una resolución de nanosegundos (hasta nueve (9) dígitos de una fracción decimal).

Código simple:

Instant instant = Instant.now() ;

instant.toString (): 2016-11-29T23: 18: 14.604Z

Puede pensar en Instant como el bloque de creación al que puede agregar un huso horario ( ZoneID ) para obtener un ZonedDateTime .

ZoneId z = ZoneId.of( "America/Montreal" ); ZonedDateTime zdt = instant.atZone( z );

Acerca de java.time

El marco java.time está integrado en Java 8 y posterior. Estas clases suplantan a las problemáticas antiguas clases heredadas de fecha y hora, como java.util.Date , Calendar y SimpleDateFormat .

El proyecto Joda-Time , 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 para obtener muchos ejemplos y explicaciones. La especificación es JSR 310 .

¿Dónde obtener las clases de java.time?

  • Java SE 8 y SE 9 y posteriores
    • Incorporado.
    • Parte de la API Java estándar con una implementación integrada.
    • Java 9 agrega algunas características y correcciones menores.
  • Java SE 6 y SE 7
    • Gran parte de la funcionalidad de java.time se transfiere a Java 6 y 7 en ThreeTen-Backport .
  • Androide
    • El proyecto ThreeTenABP adapta ThreeTen-Backport (mencionado anteriormente) específicamente para Android.
    • Vea Cómo usar ...

El proyecto ThreeTen-Extra amplía java.time con clases adicionales. Este proyecto es un terreno de prueba para posibles adiciones futuras a java.time. Puede encontrar algunas clases útiles aquí, como Interval , YearWeek , YearQuarter y más .