2012-08-22 69 views
7

No estoy interesado en cuál es la hora UTC actual en milisegundos, ni necesito mezclarme con las zonas horarias. Mi fecha original ya está almacenada como una marca de tiempo UTC.Convertir la fecha UTC en milisegundos

Tengo una fecha almacenada en una base de datos en hora UTC, "2012-06-14 05:01:25". No estoy interesado en la fecha y hora, sino solo en la parte de la fecha de la misma. Entonces, después de recuperar la fecha en Java, y excluyendo las horas, los minutos y los segundos, me queda "2012-06-14".

¿Cómo puedo convertir esto en milisegundos UTC?

Respuesta

0

Utilice el objeto Date en combinación con SimpleDateFormat.

Hay un método llamado getTime() en Fecha que devolverá los milisegundos por usted.

Ejemplo que resuelve su problema:

Date truc = new SimpleDateFormat("y-m-d").parse("2010-06-14"); 
System.out.println(truc.getTime()); 
10

EDIT: me había perdido la parte "haciendo caso omiso de la hora del día". Es ahora presente, pero cerca del final ...

El enfoque más simple es probablemente usar SimpleDateFormat, habiendo establecer la zona horaria apropiada:

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US); 
format.setTimeZone(TimeZone.getTimeZone("UTC")); 

Date date = format.parse(text); 
long millis = date.getTime(); 

(Ajuste de la zona horaria es la parte importante aquí, ya de lo contrario, va a interpretar el valor de estar en la zona horaria local de .)

alternativa, si estás haciendo algo menos trivial que esto, utilizar Joda Time que es un mucho mejor API de fecha/hora. En particular, SimpleDateFormat no es seguro para subprocesos mientras que DateTimeFormatter es:

// This can be reused freely across threads after construction. 
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss") 
    .withLocale(Locale.US) 
    .withZoneUTC(); 

// Option 1 
DateTime datetime = formatter.parseDateTime(text); 
long millis = dateTime.getMillis(); 

// Option 2, more direct, but harder to diagnose errors 
long millis = formatter.parseMillis(text); 

Ahora hasta ahora, hemos analizado sintácticamente todo el caboodle entero. La forma más fácil de ignorar la parte de fecha es sólo para redondearlo - después de todo, Java no observa los segundos intercalares, por lo que sólo puede truncar:

long millisPerDay = 24L * 60L * 60L * 1000L; // Or use TimeUnit 
long dayMillis = (millis/millisPerDay) * millisPerDay; 

que la voluntad "redondo hacia 1970" por lo que si tener una fecha antes de 1970 redondeará al final del día, pero sospecho que es poco probable que sea un problema.

Con la versión Joda Time usted podría utilizar esto en su lugar:

DateTime dateTime = formatter.parseDateTime(text); 
long millis = dateTime.toLocalDate().getLocalMillis(); 

yo personalmente no ir con la idea de tomar una subcadena. Aunque en realidad no está interesado en preservando la hora/minuto/segundo, creo que es apropiado analizar lo que le han dado y , luego descartar información. Aparte de cualquier otra cosa, hace que tu código no funcione correctamente con datos incorrectos, p.

"2012-06-100" 

o

"2012-06-14 25:01:25" 

indicar problemas en lo que eres tú el suministro de datos, y es bueno para detectar que en lugar de seguir ciegamente sólo porque los primeros 10 caracteres están bien.

+0

Desde OP sólo quiere la fecha, me subcadena (0,10) primero y analizar sólo la fecha. –

+0

@PeterLawrey: ¡Realmente me había perdido esa parte! Editará ... –

+2

@PeterLawrey: He argumentado en contra de la llamada subserie al final de la publicación. –

0
SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd"); //or whatever format you have 
Date t = ft.parse('2014-03-20'); 

String result = String.format("%tQ", t); 

System.out.printf("%tQ", t); 

Hay dos métodos aquí:

  1. se pone el resultado milisegundos en una variable resultado
  2. impresión de él hacia fuera.
0

más simple

El answer by Jon Skeet es correcta. Y él hace un buen punto acerca de incluir, en lugar de truncar, la información de la hora del día durante el análisis.

Sin embargo, su código podría ser simplificado. Especialmente porque Joda-Time ganó un nuevo método importante en las últimas versiones: withTimeAtStartOfDay. Este método reemplaza todas las clases y métodos relacionados con la "medianoche" que ahora están en desuso.

Especificar un Locale es un buen hábito, como se muestra en su código. Pero en este caso particular, un Locale no es necesario.

Su respuesta sugiere correctamente la biblioteca Joda-Time, muy superior al uso de java.util.Date, .Calendar y java.text.SimpleTextFormat. Esas clases son notoriamente molestas y deben evitarse. En su lugar, utilice Joda-Time o el nuevo java.time package integrado en Java 8 (inspirado en Joda-Time, definido por JSR 310).

primer momento del día

No se puede ignorar la hora del día si lo que quiere es un recuento de milisegundos-desde- epoch. Sospecho que lo que quieres es cambiar el tiempo al primer momento del día. En UTC, esto siempre significa el tiempo 00:00:00.000. Pero tenga en cuenta que en las zonas horarias locales, el primer momento puede ser diferente debido a Daylight Saving Time y posiblemente a otras anomalías.

ISO 8601

La cadena está casi en formato estándar ISO 8601, pero tenemos que intercambiar un T para el espacio en el medio. A continuación, podemos enviar la cadena resultante directamente a Joda-Time, ya que Joda-Time tiene incorporada formatters utilizada por defecto para cadenas estándar.

Ejemplo Código

El siguiente código de ejemplo se supone que la intención de su pregunta es analizar una cadena como un valor de fecha y hora en UTC zona horaria, ajustar el tiempo hasta el primer momento del día, y luego convertir a número de milisegundos desde Unix epoch (comienzo de 1970 en UTC).

String inputRaw = "2012-06-14 05:01:25"; 
String input = inputRaw.replace(" ", "T"); // Replace SPACE with a 'T'. 
DateTime dateTime = new DateTime(input, DateTimeZone.UTC); // Parse, assuming UTC. 
DateTime dateTimeTopOfTheDay = dateTime.withTimeAtStartOfDay(); // Adjust to first moment of the day. 
long millisecondsSinceUnixEpoch = dateTimeTopOfTheDay.getMillis(); // Convert to millis. Use a 'long', not an 'int'. 
-1

Puedo usar un enfoque simple y directo hacia adelante:

Date date = new Date(utcDateInString); 
long utcDateInMilliSeconds = date.getTime(); 
+0

Alguien rechazó mi respuesta sin dar una razón. Esta ha sido una tendencia creciente en StackOverflow últimamente y debería desalentarse. – zeeshan

Cuestiones relacionadas