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.