Android Uzyskaj aktualny znacznik czasu?


248

Chcę uzyskać bieżący znacznik czasu w ten sposób: 1320917972

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

2
FYI, kłopotliwego starych klas date-time, takie jak java.util.Date, java.util.Calendari Timestampsą teraz Legacy, wyparta przez java.time klas. Większość funkcji java.time jest przeniesiona z powrotem do Java 6 i Java 7 w projekcie ThreeTen-Backport . Dalsze dostosowanie do wcześniejszego Androida w projekcie ThreeTenABP . Zobacz Jak korzystać z ThreeTenABP… .
Basil Bourque

Odpowiedzi:


299

Rozwiązaniem jest :

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

Nie uwzględnia to przesunięcia strefy czasowej urządzenia.
kjdion84

1
@ kjdion84 przepraszam, ale dlaczego uważasz, że to byłoby ważne? Tylko na podstawie pytania.
Cԃ ա ԃ

82

Z blogu programistów:

System.currentTimeMillis()to standardowy zegar ścienny (czas i data) wyrażający milisekundy od epoki. Zegar ścienny może być ustawiony przez użytkownika lub sieć telefoniczną (patrz setCurrentTimeMillis (długi) ), aby czas mógł przeskakiwać do tyłu lub do przodu w nieprzewidziany sposób. Tego zegara należy używać tylko wtedy, gdy ważna jest korespondencja z rzeczywistymi datami i godzinami, na przykład w aplikacji kalendarza lub budzika. Pomiary czasu interwału lub upływu czasu powinny wykorzystywać inny zegar. Jeśli używasz System.currentTimeMillis(), rozważ słuchając ACTION_TIME_TICK, ACTION_TIME_CHANGEDa ACTION_TIMEZONE_CHANGEDzamierzone transmisje, aby dowiedzieć się, gdy zmienia się czas.


11
Od developer.android.com/reference/java/lang/… Odkryłem, że System.nanoTime()jest to alternatywa System.currentTimeMillis()i nie ma nieprzewidzianych wahań i jest przeznaczony do pomiaru różnic w czasie trwania.
Bianca Daniciuc

2
@ ana01 „wartość zerowa jest zwykle przy każdym ostatnim uruchomieniu urządzenia” - więc można jej użyć tylko przy porównywaniu różnic czasu trwania na tym samym urządzeniu. Nieprzydatne na przykład do przechowywania bazy danych.
Michał K

1
Tylko uwaga do komentarza @ ana01, która System.nanoTime()nie nadaje się do wyświetlania czasu naściennego. W tym celu użyj System.currentTimeMillis()zamiast tego.
Akash Agarwal

33

1320917972 jest uniksowym znacznikiem czasu używającym liczby sekund od 00:00:00 UTC 1 stycznia 1970 r. Możesz użyć TimeUnitklasy do konwersji jednostek - od System.currentTimeMillis()do sekund.

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

29

Możesz użyć klasy SimpleDateFormat :

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

22
To nie jest znacznik czasu (czas od epoki)
Michał K

1
Nie jest znacznikiem czasu, a ponadto nie jest wcale skuteczny (tworzenie SimpleDateFormat, tworzenie daty, konwersja). Unikaj tego.
Seynorth,

Odpowiadasz na coś innego, ale jest to również ważne.
ersks

24

Użyj poniższej metody, aby uzyskać aktualny znacznik czasu. Działa dla mnie dobrze.

/**
 * 
 * @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
To nie jest znacznik czasu.

1
@ Hits, to prosty format daty, a nie znacznik czasu. Po prostu używasz nazwy zmiennej jako currentTimeStap.
ersks

12

To proste użycie:

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

jeśli chcesz mieć konkretny format, potrzebujesz Formattera jak poniżej

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

8

Oto czytelny dla człowieka znacznik czasu, którego można użyć w nazwie pliku, na wypadek, gdyby ktoś potrzebował tego samego, czego potrzebowałem:

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
Hej, czy możesz też podać najlepszy sposób sortowania listy znaczników czasu? Myślałem o ich posortowaniu, ale pomyślałem, że może być lepszy sposób.
Abbas,

W celu skorzystania z niej w przyszłości dla osób, które to przeczytają, należy pamiętać, że „android.text.format.Time” jest już nieaktualny
jason.kaisersmith

5

Spróbuj tych

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

i timeStamp do formatu czasu

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

4

java.time

Chciałbym przekazać nowoczesną odpowiedź.

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

Dane wyjściowe po uruchomieniu:

1543320466

Podczas gdy dzielenie przez 1000 nie będzie dla wielu zaskoczeniem, samodzielne konwersje czasu mogą być trudne do odczytania dość szybko, więc jest to zły nawyk, kiedy możesz tego uniknąć.

InstantKlasa używam jest częścią java.time, nowoczesny daty i czasu Java API. Jest wbudowany w nowe wersje Androida, API poziom 26 i nowsze. Jeśli programujesz dla starszego Androida, możesz uzyskać backport, patrz poniżej. Jeśli nie chcesz tego robić, co zrozumiałe, nadal używałbym wbudowanej konwersji:

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

To jest to samo, co odpowiedź Sealskej. Dane wyjściowe są takie same jak poprzednio.

Pytanie: Czy mogę używać java.time na Androidzie?

Tak, java.time działa ładnie na starszych i nowszych urządzeniach z Androidem. Wymaga tylko co najmniej Java 6 .

  • W Javie 8 i nowszych oraz na nowszych urządzeniach z Androidem (od poziomu API 26) wbudowane jest nowoczesne API.
  • W Javie 6 i 7 innej niż Android, pobierz ThreeTen Backport, backport nowych klas (ThreeTen dla JSR 310; patrz łącza u dołu).
  • Na (starszym) Androidzie użyj wersji ThreeTen Backport na Androida. To się nazywa ThreeTenABP. I pamiętaj, aby zaimportować klasy daty i godziny org.threeten.bpz podpakietów.

Spinki do mankietów


1
Prawie idealna odpowiedź (przegłosowałem), ale przynajmniej moim szczerym zdaniem powinieneś usunąć odniesienie do ThreeTen Backport, ponieważ jest to pytanie dotyczące Androida, a nie Java w ogóle. Dla początkujących w systemie Android może to być mylące.
Slobodan Antonijević

1
@ SlobodanAntonijević Ważne jest, aby programiści systemu Android zrozumieli, że (a) jeśli obsługują system Android 26 i nowszy, mają wbudowaną implementację java.time , (b) jeśli obsługują system Android przed 26, muszą dodać bibliotekę , biblioteka ThreeTenABP oraz (c) jeśli korzystasz z ThreeTenABP , wiedz, że ta biblioteka jest w rzeczywistości adaptacją ThreeTen-Backport przystosowaną z Java na Androida. ThreeTenABP biblioteka jest tylko Android specyficznych otoki wokół ThreeTen-backportu bibliotece. Zobacz grafikę tabeli porównującą 3 biblioteki.
Basil Bourque,

@BasilBourque masz całkowitą rację. Ale w rzeczywistości można zaimportować ThreeTen-Backport i używać go w aplikacji na Androida, ale z ogromnym wpływem na zależność JAR od wydajności. Dlatego powiedziałem, że post powinien być bardziej szczegółowy, aby twórcy Androida nigdy nie używali ThreeTen-Backport, a zamiast tego używali ThreeTenABP dla API 25 i niższych. Widziałem wielu deweloperów na różnych tablicach, które mylą się, na której z nich należy używać Androida, ponieważ brzmią podobnie z nazwy.
Slobodan Antonijević

Dobra uwaga, @ SlobodanAntonijević. Próbowałem to uczynić nieco jaśniejszym.
Ole VV,

1
@ SlobodanAntonijević Poniższa tabela pokazuje, gdzie można uzyskać java.time dla Java i Androida.
Basil Bourque

3

Rozwiązanie w Kotlin:

val nowInEpoch = Instant.now().epochSecond

Upewnij się, że minimalna wersja zestawu SDK to 26.


0

Sugeruję użycie odpowiedzi Hitsa, ale dodając format ustawień regionalnych, tak programiści Androida zalecają :

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

Ten kod jest wersją Kotlin. Mam inny pomysł, aby dodać losową liczbę całkowitą losową w ostatniej cyfrze, aby podać czas epoki wariancji.

Wersja Kotlin

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

val deltaEpoch = oldEpoch - currentEpoch

Myślę, że lepiej będzie użyć tego kodu, niż zależy od wersji Androida 26 lub wyższej

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.