Saltar al contenido

Convertir la fecha UTC en milisegundos

Nuestros mejores investigadores han agotado sus reservas de café, por su búsqueda todo el tiempo por la respuesta, hasta que Regina encontró el hallazgo en GitHub y hoy la compartimos contigo.

Solución:

EDITAR: Me había perdido la parte de “ignorar la hora del día”. Ahora está presente, pero cerca del final …

El enfoque más simple es probablemente utilizar SimpleDateFormat, habiendo establecido la zona horaria de forma adecuada:

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

(La configuración de la zona horaria es el bit importante aquí, ya que de lo contrario interpretará el valor en el local zona horaria.)

Alternativamente, si está haciendo algo menos trivial que esto, use Joda Time, que es una API de fecha / hora mucho mejor. En particular, SimpleDateFormatno 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);

Hasta ahora, hemos analizado todo el caboodle. La forma más fácil de ignorar la parte de la fecha es simplemente redondearla; después de todo, Java no observa los segundos intercalares, por lo que podemos simplemente truncarlo:

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

Eso “redondeará hacia 1970”, así que si tienes una cita antes de 1970 redondeará al fin del día, pero sospecho que es poco probable que sea un problema.

Con la versión de Joda Time, puedes usar esto en su lugar:

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

Yo personalmente no vaya con la idea de simplemente tomar una subcadena. Aunque no estés realmente interesado en conservación la hora / minuto / segundo, creo que es apropiado analizar lo que le han dado y entonces desechar la información. Aparte de cualquier otra cosa, hace que su código falle adecuadamente con datos incorrectos, p. Ej.

"2012-06-100"

o

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

indique problemas en lo que sea que le proporcione datos, y es bueno detectar eso en lugar de continuar a ciegas solo porque los primeros 10 caracteres están bien.

ACTUALIZAR: Vea la solución moderna usando java.time clases en la respuesta correcta de Ole VV.

Más simple

La respuesta de Jon Skeet es correcta. Y 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 simplificarse. 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 una configuración regional es un buen hábito, como se muestra en su código. Pero en este caso particular no es necesario un Locale.

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 problemáticas y deben evitarse. En su lugar, utilice Joda-Time o el nuevo paquete java.time integrado en Java 8 (inspirado en Joda-Time, definido por JSR 310).

Primer momento del día

No puede ignorar la hora del día si lo que desea es un recuento de milisegundos desde la época. Sospecho que lo que quieres es cambiar la hora al primer momento del día. En UTC, esto siempre significa la hora 00:00:00.000. Pero tenga en cuenta que en las zonas horarias locales, el primer momento puede ser diferente debido al horario de verano y posiblemente a otras anomalías.

ISO 8601

Tu string está casi en formato ISO 8601 estándar, pero necesitamos cambiar un T para el ESPACIO en el medio. Entonces podemos alimentar el resultado string directamente a Joda-Time, ya que Joda-Time tiene formateadores integrados que se utilizan de forma predeterminada para cadenas estándar.

Código de ejemplo

El siguiente código de ejemplo asume que la intención de su pregunta es analizar un string como valor de fecha y hora en la zona horaria UTC, ajuste la hora al primer momento del día y luego conviértala al número de milisegundos desde la época Unix (principios 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'.

Acuérdate de que tienes concesión de agregar una reseña .

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *