Android Ottieni il timestamp corrente?


249

Voglio ottenere il timestamp corrente in questo modo: 1320917972

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

2
Cordiali saluti, le classi data-ora vecchi problematici, come java.util.Date, java.util.Calendare Timestampora sono l'eredità, soppiantato dai java.time classi. La maggior parte della funzionalità java.time è trasferita su Java 6 e Java 7 nel progetto ThreeTen-Backport . Ulteriore adattamento per Android precedente nel progetto ThreeTenABP . Vedi Come usare ThreeTenABP… .
Basil Bourque,

Risposte:


300

La soluzione è:

Long tsLong = System.currentTimeMillis()/1000;
String ts = tsLong.toString();

Ciò non tiene conto dell'offset del fuso orario del dispositivo.
kjdion84,

1
@ kjdion84 mi scusi, ma perché pensi che sarebbe importante? Basandomi solo sulla domanda.
Cԃ ա ԃ

82

Dal blog degli sviluppatori:

System.currentTimeMillis()è l'orologio "a parete" standard (ora e data) che esprime millisecondi dall'epoca. L'orologio da parete può essere impostato dall'utente o dalla rete telefonica (vedere setCurrentTimeMillis (long) ), quindi il tempo può saltare all'indietro o in avanti in modo imprevedibile. Questo orologio dovrebbe essere usato solo quando è importante la corrispondenza con le date e gli orari del mondo reale, come in un calendario o un'applicazione per la sveglia. Le misurazioni del tempo trascorso o trascorso dovrebbero usare un orologio diverso. Se si utilizza System.currentTimeMillis(), prendere in considerazione l'ascolto della ACTION_TIME_TICK, ACTION_TIME_CHANGEDe ACTION_TIMEZONE_CHANGEDle trasmissioni intento di scoprire quando cambia il tempo.


11
Da developer.android.com/reference/java/lang/… ho scoperto che System.nanoTime()è un'alternativa System.currentTimeMillis()e non ha fluttuazioni imprevedibili ed è progettata per misurare le differenze di durata.
Bianca Daniciuc,

2
@ ana01 "il valore zero è in genere all'ultimo avvio del dispositivo", quindi può essere utilizzato solo quando si confrontano le differenze di durata sullo stesso dispositivo. Non utile ad esempio per l'archiviazione del database.
Michał K,

1
Solo una nota al commento di @ ana01 che System.nanoTime()non è adatto per visualizzare l'ora dell'orologio da parete. A tale scopo, utilizzare System.currentTimeMillis()invece.
Akash Agarwal,

33

1320917972 è il timestamp di Unix che utilizza il numero di secondi a partire dalle 00:00:00 UTC del 1 ° gennaio 1970. Puoi usare la TimeUnitclasse per la conversione di unità - da System.currentTimeMillis()a a secondi.

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

29

È possibile utilizzare la classe SimpleDateFormat :

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

22
Questo non è un timestamp (tempo dall'epoca)
Michał K

1
Non un timestamp, e inoltre, per nulla efficace (creazione di SimpleDateFormat, creazione di data, conversione). Evitalo
Seynorth,

Stai rispondendo a qualcos'altro, ma è anche valido.
ersks,

24

Utilizzare il metodo seguente per ottenere il timestamp corrente. Funziona bene per me.

/**
 * 
 * @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
Questo non è un timestamp.

1
@Hits, è un semplice formato di data, non un timestamp. Stai solo usando il nome della variabile come currentTimeStap.
ersks,

12

È semplice da usare:

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

se lo vuoi in un formato particolare, allora hai bisogno di Formatter come di seguito

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

8

Ecco un timestamp leggibile dall'uomo che può essere utilizzato in un nome di file, nel caso in cui qualcuno abbia bisogno della stessa cosa di cui avevo bisogno:

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
Ehi, potresti anche dire il modo migliore per ordinare un elenco di timestamp? Stavo pensando di ordinarli da soli, ma ho pensato che potesse esserci un modo migliore.
Abbas,

Per riferimento futuro per chiunque legga questo,
sappi

5

Prova questi

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

e timeStamp al formato dell'ora

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

4

java.time

Vorrei contribuire con la risposta moderna.

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

Uscita quando si esegue proprio ora:

1543320466

Mentre la divisione per 1000 non sarà una sorpresa per molti, fare le tue conversioni di tempo può essere difficile da leggere abbastanza velocemente, quindi è una cattiva abitudine quando puoi evitarlo.

La Instantclasse che sto usando fa parte di java.time, la moderna API di data e ora di Java. È integrato nelle nuove versioni di Android, API livello 26 e versioni successive. Se stai programmando per Android precedente, potresti ottenere il backport, vedi sotto. Se non vuoi farlo, comprensibilmente, utilizzerei comunque una conversione integrata:

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

Questa è la stessa della risposta di sealskej. L'output è lo stesso di prima.

Domanda: posso usare java.time su Android?

Sì, java.time funziona perfettamente su dispositivi Android più vecchi e più recenti. Richiede solo almeno Java 6 .

  • In Java 8 e versioni successive e su dispositivi Android più recenti (dal livello API 26) l'API moderna è integrata.
  • In Java 6 e 7 non Android ottieni il ThreeTen Backport, il backport delle nuove classi (ThreeTen per JSR 310; vedi i link in basso).
  • Su (vecchi) Android usa l'edizione Android di ThreeTen Backport. Si chiama ThreeTenABP. E assicurati di importare le classi di data e ora org.threeten.bpcon i pacchetti secondari.

link


1
Risposta quasi perfetta (ho votato a favore) ma, almeno secondo la mia onesta opinione, dovresti rimuovere il riferimento ThreeTen Backport poiché questa è una domanda su Android e non su Java in generale. E potrebbe essere fonte di confusione per i principianti su Android.
Slobodan Antonijević,

1
@ SlobodanAntonijević È importante che i programmatori Android comprendano che (a) se supportano Android 26 e versioni successive, hanno un'implementazione di java.time integrata, (b) se supportano Android precoce prima dei 26, devono aggiungere una libreria , la libreria ThreeTenABP e (c) se si utilizza ThreeTenABP , sapere che questa libreria è in realtà un adattamento di ThreeTen-Backport adattato da Java ad Android. La libreria ThreeTenABP è solo un wrapper specifico per Android attorno alla libreria ThreeTen-Backport . Vedi questo grafico della tabella confrontando le 3 librerie.
Basil Bourque,

@BasilBourque hai perfettamente ragione. Tuttavia, puoi infatti importare ThreeTen-Backport e utilizzarlo in un'app Android, ma con un impatto estremamente grande sulle prestazioni a causa della sua dipendenza JAR. Questo è il motivo per cui ho detto che il post dovrebbe essere più specifico che gli sviluppatori Android non dovrebbero mai usare ThreeTen-Backport, e invece utilizzare ThreeTenABP per API 25 e supporto inferiore. Ho visto numerosi sviluppatori su varie schede che si confondono su quale dovrebbe essere usato per Android, perché suonano simili per nome.
Slobodan Antonijević,

Buon punto, @ SlobodanAntonijević. Ho provato a renderlo un po 'più chiaro.
Ole VV,

1
@ SlobodanAntonijević Questa tabella che mostra dove ottenere java.time sia per Java che per Android potrebbe aiutare a chiarire.
Basil Bourque,

3

Soluzione a Kotlin:

val nowInEpoch = Instant.now().epochSecond

Assicurarsi che la versione minima dell'SDK sia 26.


0

Suggerisco di utilizzare la risposta di Hits, ma aggiungendo un formato Locale, questo è il modo in cui gli sviluppatori Android consiglia :

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

Questo codice è la versione di Kotlin. Ho un'altra idea per aggiungere un numero casuale casuale nell'ultima cifra per dare tempo di variazione varianza.

Versione di Kotlin

val randomVariance = (0..100).shuffled().first()
val currentEpoch = (System.currentTimeMilis()/1000) + randomVariance

val deltaEpoch = oldEpoch - currentEpoch

Penso che sarà meglio usare questo kode quindi dipendere dalla versione 26 o più di Android

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.