Para su información, las clases de fecha y hora viejas problemáticas tales como java.util.Date, java.util.Calendary Timestampahora están legado, suplantados por los java.time clases. La mayor parte de la funcionalidad java.time se transfiere a Java 6 y Java 7 en el proyecto ThreeTen-Backport . Más adaptado para Android anterior en el proyecto ThreeTenABP . Ver Cómo utilizar ThreeTenABP ... .
Basil Bourque
Respuestas:
298
La solucion es :
Long tsLong =System.currentTimeMillis()/1000;String ts = tsLong.toString();
Esto no tiene en cuenta el desplazamiento de la zona horaria del dispositivo.
kjdion84
1
@ kjdion84 discúlpeme, pero ¿por qué cree que sería importante? Solo basado en la pregunta.
Cԃ ա ԃ
82
Del blog de desarrolladores:
System.currentTimeMillis()es el reloj estándar de "pared" (hora y fecha) que expresa milisegundos desde la época. El usuario o la red telefónica pueden configurar el reloj de pared (consulte setCurrentTimeMillis (largo) ), por lo que el tiempo puede saltar hacia atrás o hacia adelante de manera impredecible. Este reloj solo debe usarse cuando la correspondencia con fechas y horas del mundo real es importante, como en una aplicación de calendario o reloj despertador. Las mediciones de intervalo o tiempo transcurrido deben usar un reloj diferente. Si está utilizando System.currentTimeMillis(), considere la posibilidad de escuchar el ACTION_TIME_TICK, ACTION_TIME_CHANGEDy ACTION_TIMEZONE_CHANGEDemisiones de intención para saber cuando cambia el tiempo.
De developer.android.com/reference/java/lang/… descubrí que System.nanoTime()es una alternativa System.currentTimeMillis()y que no tiene fluctuaciones impredecibles, y está diseñada para medir las diferencias de duración.
Bianca Daniciuc
2
@ ana01 "el valor cero suele ser la última vez que se inició el dispositivo", por lo que solo se puede usar cuando se comparan las diferencias de duración en el mismo dispositivo. No es útil para el almacenamiento de bases de datos, por ejemplo.
Michał K
1
Solo una nota al comentario de @ ana01 que System.nanoTime()no es adecuada para mostrar la hora del reloj de pared. Para ese propósito, use System.currentTimeMillis()en su lugar.
Akash Agarwal
33
1320917972 es la marca de tiempo de Unix que usa el número de segundos desde las 00:00:00 UTC del 1 de enero de 1970. Puede usar la TimeUnitclase para la conversión de unidades, de System.currentTimeMillis()a segundos.
Aquí hay una marca de tiempo legible para humanos que se puede usar en un nombre de archivo, en caso de que alguien necesite lo mismo que yo:
package com.example.xyz;import android.text.format.Time;/**
* Clock utility.
*/publicclassClock{/**
* Get current time in human-readable form.
* @return current time as a string.
*/publicstaticString getNow(){Time now =newTime();
now.setToNow();String sTime = now.format("%Y_%m_%d %T");return sTime;}/**
* Get current time in human-readable form without spaces and special characters.
* The returned value may be used to compose a file name.
* @return current time as a string.
*/publicstaticString getTimeStamp(){Time now =newTime();
now.setToNow();String sTime = now.format("%Y_%m_%d_%H_%M_%S");return sTime;}}
Oye, ¿podrías decir también la mejor manera de ordenar una lista de marcas de tiempo? Estaba pensando en clasificarlos yo mismo, pero pensé que podría haber una mejor manera.
Abbas
Para referencia futura para cualquiera que lea esto, tenga en cuenta que "android.text.format.Time" ahora está en desuso
Si bien la división por 1000 no será una sorpresa para muchos, hacer sus propias conversiones de tiempo puede ser difícil de leer bastante rápido, por lo que es un mal hábito cuando puede evitarlo.
La Instantclase que estoy usando es parte de java.time, la API moderna de fecha y hora de Java. Está integrado en las nuevas versiones de Android, API nivel 26 y superior. Si está programando para Android más antiguo, puede obtener el backport, consulte a continuación. Si no quieres hacer eso, comprensiblemente, todavía usaría una conversión incorporada:
Esto es lo mismo que la respuesta de sealskej. La salida es la misma que antes.
Pregunta: ¿Puedo usar java.time en Android?
Sí, java.time funciona bien en dispositivos Android más antiguos y más nuevos. Solo requiere al menos Java 6 .
En Java 8 y versiones posteriores y en dispositivos Android más nuevos (desde el nivel 26 de API), la API moderna viene incorporada.
En Java 6 y 7 que no sean Android, obtenga ThreeTen Backport, el backport de las nuevas clases (ThreeTen para JSR 310; vea los enlaces en la parte inferior).
En Android (anterior) use la edición de Android de ThreeTen Backport. Se llama ThreeTenABP. Y asegúrese de importar las clases de fecha y hora org.threeten.bpcon subpaquetes.
Respuesta casi perfecta (he votado), pero, al menos en mi opinión honesta, debe eliminar la referencia ThreeTen Backport, ya que esta es una pregunta sobre Android y no Java en general. Y puede ser confuso para los principiantes en Android.
Slobodan Antonijević
1
@ SlobodanAntonijević Es importante que los programadores de Android entiendan que (a) si son compatibles con Android 26 y posteriores, tienen una implementación de java.time incorporada, (b) si son compatibles con Android anterior antes de 26, deben agregar una biblioteca , la biblioteca ThreeTenABP , y (c) si usa ThreeTenABP , sepa que esta biblioteca es en realidad una adaptación de ThreeTen-Backport adaptada de Java a Android. La biblioteca ThreeTenABP es solo un contenedor específico de Android alrededor de la biblioteca ThreeTen-Backport . Vea este gráfico de tabla que compara las 3 bibliotecas.
Basil Bourque
@BasilBourque tienes toda la razón. Pero, de hecho, puede importar ThreeTen-Backport y usarlo en una aplicación de Android, pero con un impacto extremadamente grande en el rendimiento debido a su dependencia JAR. Es por eso que he dicho que la publicación debería ser más específica que los desarrolladores de Android nunca deberían usar ThreeTen-Backport, y en su lugar usar ThreeTenABP para API 25 y soporte inferior. He visto numerosos desarrolladores en varias placas que se confunden sobre cuál debería usarse para Android, porque suenan similares por su nombre.
Slobodan Antonijević el
Buen punto, @ SlobodanAntonijević. He tratado de hacerlo un poco más claro.
Ole VV
1
@ SlobodanAntonijević Esta tabla que muestra dónde obtener java.time para Java y Android podría ayudar a aclararlo.
Este código es la versión de Kotlin. Tengo otra idea para agregar un entero aleatorio aleatorio en el último dígito para dar tiempo de variación de época.
Versión Kotlin
val randomVariance =(0..100).shuffled().first()
val currentEpoch =(System.currentTimeMilis()/1000)+ randomVariance
val deltaEpoch = oldEpoch - currentEpoch
Creo que será mejor usar este kode que depender de la versión de Android 26 o más
java.util.Date
,java.util.Calendar
yTimestamp
ahora están legado, suplantados por los java.time clases. La mayor parte de la funcionalidad java.time se transfiere a Java 6 y Java 7 en el proyecto ThreeTen-Backport . Más adaptado para Android anterior en el proyecto ThreeTenABP . Ver Cómo utilizar ThreeTenABP ... .Respuestas:
La solucion es :
fuente
Del blog de desarrolladores:
System.currentTimeMillis()
es el reloj estándar de "pared" (hora y fecha) que expresa milisegundos desde la época. El usuario o la red telefónica pueden configurar el reloj de pared (consulte setCurrentTimeMillis (largo) ), por lo que el tiempo puede saltar hacia atrás o hacia adelante de manera impredecible. Este reloj solo debe usarse cuando la correspondencia con fechas y horas del mundo real es importante, como en una aplicación de calendario o reloj despertador. Las mediciones de intervalo o tiempo transcurrido deben usar un reloj diferente. Si está utilizandoSystem.currentTimeMillis()
, considere la posibilidad de escuchar elACTION_TIME_TICK
,ACTION_TIME_CHANGED
yACTION_TIMEZONE_CHANGED
emisiones de intención para saber cuando cambia el tiempo.fuente
System.nanoTime()
es una alternativaSystem.currentTimeMillis()
y que no tiene fluctuaciones impredecibles, y está diseñada para medir las diferencias de duración.System.nanoTime()
no es adecuada para mostrar la hora del reloj de pared. Para ese propósito, useSystem.currentTimeMillis()
en su lugar.1320917972 es la marca de tiempo de Unix que usa el número de segundos desde las 00:00:00 UTC del 1 de enero de 1970. Puede usar la
TimeUnit
clase para la conversión de unidades, deSystem.currentTimeMillis()
a segundos.fuente
Puede usar la clase SimpleDateFormat :
fuente
Use el siguiente método para obtener la marca de tiempo actual. Funciona bien para mí.
fuente
Es de uso simple:
si lo quieres en un formato particular, entonces necesitas formateador como a continuación
fuente
Aquí hay una marca de tiempo legible para humanos que se puede usar en un nombre de archivo, en caso de que alguien necesite lo mismo que yo:
fuente
Prueba estos
y timeStamp a formato de hora
fuente
java.time
Me gustaría contribuir con la respuesta moderna.
Salida cuando se ejecuta justo ahora:
Si bien la división por 1000 no será una sorpresa para muchos, hacer sus propias conversiones de tiempo puede ser difícil de leer bastante rápido, por lo que es un mal hábito cuando puede evitarlo.
La
Instant
clase que estoy usando es parte de java.time, la API moderna de fecha y hora de Java. Está integrado en las nuevas versiones de Android, API nivel 26 y superior. Si está programando para Android más antiguo, puede obtener el backport, consulte a continuación. Si no quieres hacer eso, comprensiblemente, todavía usaría una conversión incorporada:Esto es lo mismo que la respuesta de sealskej. La salida es la misma que antes.
Pregunta: ¿Puedo usar java.time en Android?
Sí, java.time funciona bien en dispositivos Android más antiguos y más nuevos. Solo requiere al menos Java 6 .
org.threeten.bp
con subpaquetes.Enlaces
java.time
.java.time
se describió por primera vez.java.time
Java 6 y 7 (ThreeTen para JSR-310).fuente
Solución en Kotlin:
Asegúrese de que su versión mínima de SDK sea 26.
fuente
Sugiero usar la respuesta de Hits, pero agregando un formato de configuración regional, así es como los desarrolladores de Android recomiendan :
fuente
Este código es la versión de Kotlin. Tengo otra idea para agregar un entero aleatorio aleatorio en el último dígito para dar tiempo de variación de época.
Versión Kotlin
Creo que será mejor usar este kode que depender de la versión de Android 26 o más
fuente