Android Obtener marca de tiempo actual?


247

Quiero obtener la marca de tiempo actual así: 1320917972

int time = (int) (System.currentTimeMillis());
Timestamp tsTemp = new Timestamp(time);
String ts =  tsTemp.toString();

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


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

String timeStamp = String.valueOf(TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis()));

29

Puede usar la clase SimpleDateFormat :

SimpleDateFormat s = new SimpleDateFormat("ddMMyyyyhhmmss");
String format = s.format(new Date());

22
Esto no es una marca de tiempo (tiempo desde la época)
Michał K

1
No es una marca de tiempo, y además, no es eficiente en absoluto (creación de SimpleDateFormat, creación de fecha, conversión). Evítalo.
Seynorth

Estás respondiendo algo más, pero también es válido.
ersks

24

Use el siguiente método para obtener la marca de tiempo actual. Funciona bien para mí.

/**
 * 
 * @return yyyy-MM-dd HH:mm:ss formate date as string
 */
public static String getCurrentTimeStamp(){
    try {

        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String currentDateTime = dateFormat.format(new Date()); // Find todays date

        return currentDateTime;
    } catch (Exception e) {
        e.printStackTrace();

        return null;
    }
}

37
Eso no es una marca de tiempo.

1
@Hits, es formato de fecha simple, no una marca de tiempo. Solo está utilizando el nombre de la variable como currentTimeStap.
ersks

12

Es de uso simple:

long millis = new Date().getTime();

si lo quieres en un formato particular, entonces necesitas formateador como a continuación

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String millisInString  = dateFormat.format(new Date());

8

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.
 */
public class Clock {

    /**
     * Get current time in human-readable form.
     * @return current time as a string.
     */
    public static String getNow() {
        Time now = new Time();
        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.
     */
    public static String getTimeStamp() {
        Time now = new Time();
        now.setToNow();
        String sTime = now.format("%Y_%m_%d_%H_%M_%S");
        return sTime;
    }

}

1
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
jason.kaisersmith

5

Prueba estos

time.setText(String.valueOf(System.currentTimeMillis()));

y timeStamp a formato de hora

SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
String dateString = formatter.format(new Date(Long.parseLong(time.getText().toString())));
time.setText(dateString);

4

java.time

Me gustaría contribuir con la respuesta moderna.

    String ts = String.valueOf(Instant.now().getEpochSecond());
    System.out.println(ts);

Salida cuando se ejecuta justo ahora:

1543320466

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:

    String ts = String.valueOf(TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis()));
    System.out.println(ts);

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.

Enlaces


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.
Basil Bourque

3

Solución en Kotlin:

val nowInEpoch = Instant.now().epochSecond

Asegúrese de que su versión mínima de SDK sea 26.


0

Sugiero usar la respuesta de Hits, pero agregando un formato de configuración regional, así es como los desarrolladores de Android recomiendan :

try {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
        return dateFormat.format(new Date()); // Find todays date
    } catch (Exception e) {
        e.printStackTrace();

        return null;
    }

0

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.