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

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.

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

  • RecyclerView se bloquea al desplazarse
  • iniciar gira virtual con gmaps v2 para android
  • Android compila, sobre demasiados métodos
  • ¿Cuál sería una simple expresión regular para la comprobación de contraseña durante la suscripción?
  • Combinación de objeto Realm y objeto Gson
  • El uso de MultiDex en Android App ejecuta ProGuard dos veces y sólo segunda vez con Advertencias / Notas?
  • Cómo pasar valores hexadecimales a una cadena - Android
  • Tarea Simple de Reconocimiento de Imágenes en Android: Dominó Lectura
  • ¿Cómo hago que mi ImageView tenga un tamaño fijo independientemente del tamaño del mapa de bits
  • Android onTouchListener en LinearLayout
  • ¿Cómo serializar usando gson con @SerializedName anotación?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.