¿Cómo convertir el formato ISO8601 en milisegundos?
Estoy bastante sorprendido de que todavía no he encontrado una manera muy fácil teniendo en cuenta la frecuencia ISO8601 se utiliza en JSON.
Básicamente, estoy tomando una cadena que se parece a esto: 2014-10-23T00:35:14.800Z
y convertirlo en algo como hace 50 minutes ago
.
- Dar permiso de actividad en AndroidManifest
- La interfaz de usuario de Tablet no funciona en mi aplicación
- FilenameFilter, buscando carpetas
- ¿Cuál es el tiempo de espera predeterminado de usar HttpGet y DefaultHttpClient?
- OR cláusula en firebase java android
Primero, tengo que cambiar 2014-10-23T00:35:14.800Z
a 2014-10-23'T'00:35:14.800Z
, entonces necesito convertirlo en milisegundos, entonces es fácil.
Mi código actual:
private void setTimestamp(String timeCreated) { int indexOfT = timeCreated.indexOf('T'); String properFormat = new StringBuilder(timeCreated).insert(indexOfT + 1, "'") .insert(indexOfT, "'") .toString(); timeStamp = (String) DateUtils.getRelativeTimeSpanString(Long.parseLong(properFormat), System.currentTimeMillis(), DateUtils.SECONDS_IN_MILLIS); }
El culpable es Long.parseLong(properFormat)
. Necesito convertir properFormat
en milisegundos.
- Java.net.ConnectException: no se conectó a localhost / 127.0.0.1 (puerto 9090): falló conexión: ECONNREFUSED (Connection refused)
- GetLastNonConfigurationInstance devuelve siempre null
- Android, cámara frontal y posterior Orientación, Paisaje
- ArrayList a DavidWebb Android
- Botón de pantalla completa de Video dentro de WebView no funciona
- Extraer el archivo AndroidManifest.xml de apk usando sólo Java
- ¿Cuál es la estructura / patrón de android / java para organizar las llamadas de servicio web http en el proyecto?
- Bug con Android spinner en 2.2 relacionado con el arreglo de disposición
Tl dr
Instant.parse( "2014-10-23T00:35:14.800Z" ) .toEpochMilli()
One-Liner En java.time
El framework java.time está integrado en Java 8 y posterior. Estas nuevas clases suplantan las viejas clases de fecha y hora agrupadas con las primeras versiones de Java como java.util.Date/.Calendar. Vea Tutorial . Las clases de java.time también suplantan la altamente exitosa biblioteca de Joda-Time , siendo construidas por algunas de las mismas personas incluyendo ser dirigidas por el mismo Stephen Colbourne .
Un Instant
es un momento en la línea de tiempo en UTC con una resolución de nanosegundos . Se puede pedir un recuento de milisegundos desde su época (primer momento de 1970 en UTC ). Pero recuerde que un Instant
puede tener datos adicionales, siendo nanosegundos más finos que milisegundos. Así que puede estar perdiendo datos en esa pequeña fracción de una fracción de segundo.
Las clases java.time utilizan formatos estándar ISO 8601 al analizar / generar cadenas. No es necesario especificar un patrón de formato. La clase Instant
puede analizar directamente una cadena.
Instant.parse( "2014-10-23T00:35:14.800Z" )
Puedes convertirlo en un recuento de milisegundos desde la época del primer momento de 1970 en UTC llamando toEpochMilli
Tenga en cuenta la posible pérdida de datos, ya que la clase Instant
puede contener nanoseconds. Así que la extracción de milisegundos truncará cualquier microsegundo o nanosegundo en cualquier segundo fraccionario. Su cadena de ejemplo tiene sólo tres dígitos en el segundo fraccionario, por lo que es sólo milisegundos. Pero seis o nueve dígitos de la fracción decimal se truncarían a tres cuando se convirtieran en un recuento de milisegundos.
long millisFromEpoch = Instant.parse( "2014-10-23T00:35:14.800Z" ).toEpochMilli();
Para obtener el tiempo transcurrido en términos de horas-minutos-segundos, utilice la clase Duration
. Alimentar su método between
un par de momentos en el tiempo.
Duration duration = Duration.between( Instant.parse( "2014-10-23T00:35:14.800Z" ) , Instant.now() );
One-Liner en Joda-Time
ACTUALIZACIÓN: El proyecto Joda-Time está en modo de mantenimiento, con el equipo recomendando la migración a las clases java.time.
Con la biblioteca Joda-Time 2.5:
long millisSinceEpoch = new DateTime( "2014-10-23T00:35:14.800Z" ).getMillis();
Joda-Time analiza y genera las cadenas ISO 8601 de forma predeterminada. Joda-Time funciona en Android. Las clases java.util.Date/.Calendar son notoriamente problemáticas, confusas y defectuosas. Evítales.
Así que resulta que la respuesta fue más simple de lo que yo hubiera imaginado.
private void setTimestamp(String timeCreated) { DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); try { Date timeCreatedDate = dateFormat.parse(timeCreated); timeStamp = (String) DateUtils.getRelativeTimeSpanString(timeCreatedDate.getTime(), System.currentTimeMillis(), DateUtils.SECONDS_IN_MILLIS); } catch ( ParseException e) {} }
Eso funcionará.