2011-08-18 19 views
5

que tiene una aplicación Grails con el siguiente código:tiempo de Java en GMT

Date now = Calendar.getInstance().getTime() //Also tried new Date() 
println "now: " + now 

Cuando hago esto, me sale now: Thu Aug 18 12:47:09 CDT 2011. Necesito que la fecha esté en GMT, no en la hora local porque necesito almacenar la hora GMT en una base de datos. Puedo usar un objeto SimpleFeat simple para imprimir la hora en GMT, pero necesito almacenarlo realmente como GMT.

Pregunta: ¿Cómo convierto un objeto Date a un objeto Date usando GMT?

+0

@jpredham probablemente debería obtener la "respuesta" a esta pregunta ya que está en lo correcto al recuperar la fecha/hora como GMT. (Lo probé yo mismo y lo encontré cierto.) Además, él es más nuevo y el resto de nosotros ya tenemos bastante reputación. –

+0

FYI, las viejas clases problemáticas de fecha y hora como ['java.util.Date'] (https://docs.oracle.com/javase/9/docs/api/java/util/Date.html), [ 'java.util.Calendar'] (https://docs.oracle.com/javase/9/docs/api/java/util/Calendar.html), y' java.text.SimpleDateFormat' ahora son [legacy] (https://en.wikipedia.org/wiki/Legacy_system), suplantado por el [java.time] (https://docs.oracle.com/javase/9/docs/api/java/time/package-summary. html) clases integradas en Java 8 y Java 9. Consulte [Tutorial de Oracle] (https://docs.oracle.com/javase/tutorial/datetime/TOC.html). –

Respuesta

5

Esto acentúa por qué Java es una mierda en el tiempo. Las publicaciones anteriores están todas cerradas, pero debemos ser muy cuidadosos para obtener la hora actual en GMT y obtener la hora actual en CDT y llamando al GMT.

TimeZone reference = TimeZone.getTimeZone("GMT"); 
Calendar myCal = Calendar.getInstance(reference); 

Este es el horario actual en GMT, con un contexto de huso horario de GMT.

Convertir en un objeto Date que mantiene intacta la zona que necesita para llamar:

TimeZone.setDefault(reference); 

Este ajuste va a durar el tiempo que su JVM actual. Ahora, llamar a obtener tiempo debería producir el resultado deseado.

myCal.getTime(); 
+0

Felicitaciones a usted! Alteré mi publicación para reflejar mejor lo que dijo. E incluso el elemento ZONE_OFFSET no funcionó. ¡Buena atrapada! –

+0

¡Gracias por la ayuda! ¡Funcionó como por arte de magia! –

0

Internamente, un objeto de calendario almacena la hora en UTC (el nombre moderno para GMT). getTimeInMillis() devuelve un valor UTC, y es probablemente lo que desea almacenar.

0

Deberías probar GregorianCalendar # setTimeZone (TimeZone timeZone).

0

El uso de System.currentTimeMillis() no solo es mucho más rápido que usar el Calendario o la Fecha, siempre le da la hora GMT. Si desea mostrar esta vez, puede usar SimpleDateFormat, estableciendo el huso horario como lo desee.

2

Bueno, si realmente quieres hora en GMT, que necesita para obtener como GMT (@jpredham es correcto. Felicitaciones a usted! Edición de mi post para reflejar esto)

Así que haga lo siguiente

//this option uses TimeZone 
TimeZone gmtTimeZone = TimeZone.getTimeZone("GMT"); 
TimeZone.setDefault(gmtTimeZone); 
Calendar calendar = Calender.getInstance(gmtTimeZone); 

Date myDate = calendar.getTime(); 
1

Prueba esto:

println Calendar.getInstance(TimeZone.getTimeZone('GMT')).format('HH:mm:ss') 

Tenga en cuenta que al convertir a una fecha, se pierde la información de zona horaria. Cuando Java/Groovy formatea su fecha para imprimir, automáticamente la formatea para su zona horaria local. No te preocupes, tu fecha no tiene una zona horaria asociada. Puede volver a agregar la zona horaria correcta cuando la muestre de la siguiente manera:

0

Está confundiendo el objeto de fecha y hora con su representación de serie. Todas las bibliotecas comunes de fecha y hora en Java (java.util.Date, Joda-Time, java.time en Java 8) rastrean internamente un número fraccionario de segundos desde el primer momento de 1970 en UTC mientras se ignoran los segundos intercalares. Por lo tanto, en las tres bibliotecas, la fecha y hora es internamente siempre en UTC/GMT.

Por lo tanto, su pregunta de cómo convertir un objeto Date a un objeto Date en GMT (UTC) no tiene sentido.

Las dos mejores bibliotecas (Joda-Time y java.time) también rastrean un huso horario dentro del objeto de fecha y hora. El notoriamente problemático java.util.Date no tiene asignada la zona horaria pero confusamente aplica la zona horaria predeterminada actual de la JVM cuando se invoca el método toString.

Para el registro, Joda-Time hace un breve trabajo de esto.

DateTime nowUtc = DateTime.now(DateTimeZone.UTC); 

Llamando al método toString del objeto que genera una cadena en formato ISO 8601 en la hora universal (UTC).

Busque StackOverflow para "Joda" y "formateador" para encontrar muchos ejemplos de ajustes a otras zonas horarias.

0

tl; dr

Instant.now() // Capture current moment in UTC. 
    .toString() // Generate a String object in standard ISO 8601 format, YYYY-MM-DDTHH:MM:SS.SSSSSSSSSZ. 

2018-02-16T23: 28: 01.101324Z

java.time

El enfoque moderno utiliza java.time clases. Evite por completo las problemáticas clases heredadas de fecha y hora.

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

Instant instant = Instant.now() ; // Capture the current moment in UTC. 

generar una cadena en el formato estándar ISO 8601 llamando toString.

String output = instant.toString() ; 

Si necesita más flexibilidad que proporciona Instant, como el formateo, mientras que la generación de cadenas, utilice OffsetDateTime con la constante ZoneOffset.UTC.

OffsetDateTime odt = OffsetDateTime.now(ZoneOffset.UTC) ; // Capture the current moment in UTC. 

Para generar cadenas en formatos no estándar, utilice un DateTimeFormatter.


Sobre java.time

El marco java.time está incorporado en Java 8 y versiones posteriores. Estas clases suplantan a las viejas y problemáticas clases de fecha y hora de legacy, como java.util.Date, Calendar, & SimpleDateFormat.

El proyecto Joda-Time, ahora en maintenance mode, recomienda la migración a las clases java.time.

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

El uso de un JDBC driver compatible con JDBC 4.2 o temprano, es posible intercambiar java.time objetos directamente con su base de datos. No necesita cadenas ni clases java.sql. *.

¿Dónde obtener las clases java.time?

  • Java SE 8, Java SE 9, y más tarde
    • incorporado.
    • Parte de la API estándar de Java con una implementación integrada.
    • Java 9 agrega algunas características menores y correcciones.
  • Java SE 6 y Java SE 7
    • Gran parte de la funcionalidad de back-java.time está portado a Java 6 & 7 en ThreeTen-Backport.
  • Android
    • Las versiones posteriores de las implementaciones de haces de Android de las clases java.time.
    • Para Android anterior, el proyecto ThreeTenABP se adapta a ThreeTen-Backport (mencionado anteriormente). Ver How to use ThreeTenABP….

El proyecto se extiende ThreeTen-Extra 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 more.

Cuestiones relacionadas