Android Aktuellen Zeitstempel abrufen?


247

Ich möchte den aktuellen Zeitstempel so erhalten: 1320917972

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

2
Zu Ihrer Information, die störenden alten Datum Zeitklassen wie java.util.Date, java.util.Calendarund Timestampsind jetzt Erbe, durch die verdrängte java.time Klassen. Die meisten Funktionen von java.time werden im ThreeTen-Backport- Projekt auf Java 6 und Java 7 zurückportiert . Weiter angepasst für frühere Android im ThreeTenABP- Projekt. Siehe Verwendung von ThreeTenABP… .
Basil Bourque

Antworten:


298

Die Lösung ist :

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

Dies berücksichtigt nicht den Zeitzonenversatz des Geräts.
kjdion84

1
@ kjdion84 Entschuldigung, aber warum denkst du, wäre es wichtig? Nur basierend auf der Frage.
Cԃ ա ԃ

82

Aus dem Entwicklerblog:

System.currentTimeMillis()ist die Standard-Wanduhr (Uhrzeit und Datum), die Millisekunden seit der Epoche ausdrückt. Die Wanduhr kann vom Benutzer oder vom Telefonnetz eingestellt werden (siehe setCurrentTimeMillis (lang) ), sodass die Zeit möglicherweise unvorhersehbar vor- oder zurückspringt. Diese Uhr sollte nur verwendet werden, wenn die Korrespondenz mit realen Daten und Zeiten wichtig ist, z. B. in einem Kalender oder einer Weckeranwendung. Intervall- oder abgelaufene Zeitmessungen sollten eine andere Uhr verwenden. Wenn Sie verwenden System.currentTimeMillis(), sollten Sie auf das Hören ACTION_TIME_TICK, ACTION_TIME_CHANGEDund ACTION_TIMEZONE_CHANGEDIntent - Übertragungen , um herauszufinden , wenn die Zeit ändert.


11
Unter developer.android.com/reference/java/lang/… habe ich festgestellt, dass dies System.nanoTime()eine Alternative zu System.currentTimeMillis()unvorhersehbaren Schwankungen darstellt und zur Messung von Dauerunterschieden ausgelegt ist.
Bianca Daniciuc

2
@ ana01 "Der Nullwert ist normalerweise immer dann, wenn das Gerät zuletzt gestartet wurde". Daher kann er nur verwendet werden, wenn Sie die Dauerunterschiede auf demselben Gerät vergleichen. Zum Beispiel nicht nützlich für die Datenbankspeicherung.
Michał K

1
Nur eine Anmerkung zu @ ana01s Kommentar, System.nanoTime()die nicht zur Anzeige der Wanduhrzeit geeignet ist. Verwenden Sie zu diesem Zweck System.currentTimeMillis()stattdessen.
Akash Agarwal

33

1320917972 ist ein Unix-Zeitstempel, der die Anzahl der Sekunden seit 00:00:00 UTC am 1. Januar 1970 verwendet. Sie können die TimeUnitKlasse für die Einheitenumrechnung verwenden - von System.currentTimeMillis()in Sekunden.

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

29

Sie können die SimpleDateFormat- Klasse verwenden:

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

22
Dies ist kein Zeitstempel (Zeit seit der Epoche)
Michał K

1
Kein Zeitstempel und darüber hinaus überhaupt nicht wirksam (Erstellung von SimpleDateFormat, Erstellung von Datum, Konvertierung). Vermeide es.
Seynorth

Sie antworten auf etwas anderes, aber es ist auch gültig.
ersks

24

Verwenden Sie die folgende Methode, um den aktuellen Zeitstempel abzurufen. Es funktioniert gut für mich.

/**
 * 
 * @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
Das ist kein Zeitstempel.

1
@Hits, es ist ein einfaches Datumsformat, kein Zeitstempel. Sie verwenden nur den Variablennamen als currentTimeStap.
ersks

12

Es ist einfach zu bedienen:

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

Wenn Sie es in einem bestimmten Format möchten, benötigen Sie den folgenden Formatierer

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

8

Hier ist ein für Menschen lesbarer Zeitstempel, der in einem Dateinamen verwendet werden kann, für den Fall, dass jemand dasselbe benötigt, das ich benötigt habe:

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
Hey, kannst du auch sagen, wie man eine Liste von Zeitstempeln am besten sortiert? Ich dachte daran, sie selbst zu sortieren, dachte aber, es könnte einen besseren Weg geben.
Abbas

Für zukünftige Referenz für alle, die dies lesen, beachten Sie, dass "android.text.format.Time" jetzt veraltet ist
jason.kaisersmith

5

Probiere diese

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

und Zeitstempel zum Zeitformat

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

4

java.time

Ich möchte die moderne Antwort beitragen.

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

Ausgabe beim Ausführen gerade jetzt:

1543320466

Während die Division durch 1000 für viele nicht überraschend ist, kann es schwierig sein, eigene Zeitkonvertierungen durchzuführen, und es ist daher eine schlechte Angewohnheit, sich darauf einzulassen, wenn Sie dies vermeiden können.

Die InstantKlasse, die ich verwende, ist Teil von java.time, der modernen Java-API für Datum und Uhrzeit. Es ist in neue Android-Versionen ab API-Level 26 integriert. Wenn Sie für älteres Android programmieren, erhalten Sie möglicherweise den Backport (siehe unten). Wenn Sie das verständlicherweise nicht möchten, würde ich immer noch eine integrierte Konvertierung verwenden:

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

Dies ist die gleiche Antwort wie von Sealskej. Die Ausgabe ist dieselbe wie zuvor.

Frage: Kann ich java.time unter Android verwenden?

Ja, java.time funktioniert gut auf älteren und neueren Android-Geräten. Es erfordert nur mindestens Java 6 .

  • In Java 8 und höher und auf neueren Android-Geräten (ab API-Level 26) ist die moderne API integriert.
  • In Nicht-Android Java 6 und 7 erhalten Sie den ThreeTen Backport, den Backport der neuen Klassen (ThreeTen für JSR 310; siehe die Links unten).
  • Verwenden Sie auf (älteren) Android die Android-Edition von ThreeTen Backport. Es heißt ThreeTenABP. Und stellen Sie sicher, dass Sie die Datums- und org.threeten.bpZeitklassen mit Unterpaketen importieren.

Links


Fast perfekte Antwort (ich habe gestimmt), aber zumindest meiner ehrlichen Meinung nach sollten Sie die ThreeTen Backport-Referenz entfernen, da dies eine Frage zu Android und nicht zu Java im Allgemeinen ist. Und es kann für Anfänger bei Android verwirrend werden.
Slobodan Antonijević

1
@ SlobodanAntonijević Für Android-Programmierer ist es wichtig zu verstehen, dass (a) wenn sie Android 26 und höher unterstützen, eine Implementierung von java.time integriert ist, (b) wenn sie frühes Android vor 26 unterstützen, sie eine Bibliothek hinzufügen müssen , die ThreeTenABP- Bibliothek und (c) bei Verwendung von ThreeTenABP wissen, dass diese Bibliothek tatsächlich eine Anpassung von ThreeTen-Backport ist, die von Java an Android angepasst wurde. Die ThreeTenABP- Bibliothek ist nur ein Android-spezifischer Wrapper um die ThreeTen-Backport- Bibliothek. In dieser Tabellengrafik werden die 3 Bibliotheken verglichen.
Basil Bourque

@BasilBourque Sie sind völlig richtig. Sie können ThreeTen-Backport zwar importieren und in einer Android-App verwenden, dies hat jedoch aufgrund der JAR-Abhängigkeit einen extrem großen Einfluss auf die Leistung. Aus diesem Grund habe ich gesagt, dass der Beitrag spezifischer sein sollte, dass Android-Entwickler niemals ThreeTen-Backport verwenden sollten, sondern stattdessen ThreeTenABP für die Unterstützung von API 25 und darunter. Ich habe zahlreiche Entwickler auf verschiedenen Boards gesehen, die sich nicht sicher sind, welches für Android verwendet werden soll, weil sie namentlich ähnlich klingen.
Slobodan Antonijević

Guter Punkt, @ SlobodanAntonijević. Ich habe versucht, es nur ein wenig klarer zu machen.
Ole VV

1
@ SlobodanAntonijević Diese Tabelle zeigt, wo Sie java.time für Java und Android erhalten können.
Basil Bourque

3

Lösung in Kotlin:

val nowInEpoch = Instant.now().epochSecond

Stellen Sie sicher, dass Ihre SDK-Mindestversion 26 ist.


0

Ich schlage vor, die Antwort von Hits zu verwenden, aber ein Gebietsschema-Format hinzuzufügen, so empfehlen Android-Entwickler :

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

Dieser Code ist eine Kotlin-Version. Ich habe eine andere Idee, eine zufällige Shuffle-Ganzzahl in die letzte Ziffer einzufügen, um die Varianz-Epochenzeit anzugeben.

Kotlin-Version

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

val deltaEpoch = oldEpoch - currentEpoch

Ich denke, es wird besser sein, diesen Kode zu verwenden, als von Android Version 26 oder mehr abhängig zu sein

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.