Convierte un formato de fecha en época

Tengo una cadena con un formato de fecha como

Jun 13 2003 23:11:52.454 UTC 

que contiene milisegundos … que quiero convertir en época. ¿Existe una utilidad en Java que pueda usar para hacer esta conversión?

Este código muestra cómo usar un java.text.SimpleDateFormat para analizar un java.util.Date de un String:

 String str = "Jun 13 2003 23:11:52.454 UTC"; SimpleDateFormat df = new SimpleDateFormat("MMM dd yyyy HH:mm:ss.SSS zzz"); Date date = df.parse(str); long epoch = date.getTime(); System.out.println(epoch); // 1055545912454 

Date.getTime() devuelve el tiempo de época en milisegundos.

También puedes usar la nueva API de Java 8

 import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; public class StackoverflowTest{ public static void main(String args[]){ String strDate = "Jun 13 2003 23:11:52.454 UTC"; DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MMM dd yyyy HH:mm:ss.SSS zzz"); ZonedDateTime zdt = ZonedDateTime.parse(strDate,dtf); System.out.println(zdt.toInstant().toEpochMilli()); // 1055545912454 } } 

La clase DateTimeFormatter reemplaza al antiguo SimpleDateFormat . A continuación, puede crear un ZonedDateTime desde el que puede extraer el tiempo de época deseado.

La principal ventaja es que ahora estás seguro para subprocesos.

Gracias a Basil Bourque por sus comentarios y sugerencias. Lee su respuesta para más detalles.

tl; dr

 ZonedDateTime.parse( "Jun 13 2003 23:11:52.454 UTC" , DateTimeFormatter.ofPattern ( "MMM d uuuu HH:mm:ss.SSS z" ) ) .toInstant() .toEpochMilli() 

1055545912454

java.time

Esta respuesta se expande en la respuesta de Lockni .

DateTimeFormatter

Primero defina un patrón de formato para que coincida con su cadena de entrada creando un objeto DateTimeFormatter .

 String input = "Jun 13 2003 23:11:52.454 UTC"; DateTimeFormatter f = DateTimeFormatter.ofPattern ( "MMM d uuuu HH:mm:ss.SSS z" ); 

ZonedDateTime

Analizar la cadena como ZonedDateTime . Puedes pensar en esa clase como: ( Instant + ZoneId ).

 ZonedDateTime zdt = ZonedDateTime.parse ( "Jun 13 2003 23:11:52.454 UTC" , f ); 

zdt.toString (): 2003-06-13T23: 11: 52.454Z [UTC]

Cuenta-de-época

No recomiendo rastrear valores de fecha y hora como un recuento de la época . Hacerlo dificulta la depuración ya que los seres humanos no pueden discernir un número significativo de fecha a partir de un número, por lo que los valores no válidos / inesperados pueden pasar desapercibidos. También dichos recuentos son ambiguos, en granularidad (segundos enteros, milli, micro, nano, etc.) y en época (al menos dos docenas en varios sistemas informáticos).

Pero si insistes puedes obtener una cuenta de milisegundos desde la época del primer momento de 1970 en UTC ( 1970-01-01T00:00:00 ) a través de la clase Instant . Tenga en cuenta que esto significa pérdida de datos al truncar de nanosegundos a milisegundos.

 Instant instant = zdt.toInstant (); 

instant.toString (): 2003-06-13T23: 11: 52.454Z

 long millisSinceEpoch = instant.toEpochMilli() ; 

1055545912454

Acerca de java.time

El marco java.time está integrado en Java 8 y posterior. Estas clases suplantan a las antiguas clases problemáticas de fecha y hora, como java.util.Date , .Calendar y java.text.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 Stack Overflow para obtener muchos ejemplos y explicaciones.

Gran parte de la funcionalidad de java.time se transfiere a Java 6 y 7 en ThreeTen-Backport y se adapta mejor a Android en ThreeTenABP (ver 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 .

Crear método común para convertir el formato de cadena a fecha

  public static void main(String[] args) throws Exception { long test=ConvertStringToDate("May 26 10:41:23","MMM dd hh:mm:ss"); long test2=ConvertStringToDate("Tue, Jun 06 2017, 12:30 AM","EEE, MMM dd yyyy, hh:mm a"); long test3=ConvertStringToDate("Jun 13 2003 23:11:52.454 UTC","MMM dd yyyy HH:mm:ss.SSS zzz"); } private static long ConvertStringToDate(String dateString,String format) { try { return new SimpleDateFormat(format).parse(dateString).getTime(); } catch (ParseException e) { } return 0; }