simple java grails date gmt

simple date format java



Tiempo de Java en GMT (8)

Tengo una aplicación Grails con el siguiente código:

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

Cuando hago esto, obtengo 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?


Bueno, si realmente quieres tiempo en GMT, debes obtenerlo como GMT (@jpredham tiene razón. Felicitaciones a ti! Editando mi publicación para reflejar esto)

Entonces haz lo siguiente

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


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


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

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

Esta es la hora actual en GMT, con un contexto de zona horaria de GMT.

Para convertir a un objeto Date que mantiene intacta la zona, deberá llamar a:

TimeZone.setDefault(reference);

Esta configuración durará tanto como su JVM actual. Ahora, llamar a obtener tiempo debería producir el resultado deseado.

myCal.getTime();


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.


Prueba esto:

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

Tenga en cuenta que cuando convierte a una fecha, pierde la información de la 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 así:

Date now = Calendar.getInstance(TimeZone.getTimeZone(''GMT'')).time def formatter = new java.text.SimpleDateFormat(''HH:mm:ss'') formatter.timeZone = TimeZone.getTimeZone(''GMT'') println formatter.format(now)


Usar 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.


Está confundiendo el objeto de fecha y hora con su representación de cadena. 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 está internamente siempre en UTC / GMT.

Entonces 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 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 );

Llamar al método toString de ese objeto genera una cadena en formato ISO 8601 en tiempo Zulú (UTC).

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


Echa un vistazo a Joda-Time . También hay muchos aquí , pero parece intuitivamente más complicado de lo que debería ser.