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.
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.
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.
*/publicclassClock{/**
* Get current time in human-readable form.
* @return current time as a string.
*/publicstaticString getNow(){Time now =newTime();
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.
*/publicstaticString getTimeStamp(){Time now =newTime();
now.setToNow();String sTime = now.format("%Y_%m_%d_%H_%M_%S");return sTime;}}
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:
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.
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.
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
java.util.Date
,java.util.Calendar
iTimestamp
są 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… .Odpowiedzi:
Rozwiązaniem jest :
źródło
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żywaszSystem.currentTimeMillis()
, rozważ słuchającACTION_TIME_TICK
,ACTION_TIME_CHANGED
aACTION_TIMEZONE_CHANGED
zamierzone transmisje, aby dowiedzieć się, gdy zmienia się czas.źródło
System.nanoTime()
jest to alternatywaSystem.currentTimeMillis()
i nie ma nieprzewidzianych wahań i jest przeznaczony do pomiaru różnic w czasie trwania.System.nanoTime()
nie nadaje się do wyświetlania czasu naściennego. W tym celu użyjSystem.currentTimeMillis()
zamiast tego.1320917972 jest uniksowym znacznikiem czasu używającym liczby sekund od 00:00:00 UTC 1 stycznia 1970 r. Możesz użyć
TimeUnit
klasy do konwersji jednostek - odSystem.currentTimeMillis()
do sekund.źródło
Możesz użyć klasy SimpleDateFormat :
źródło
Użyj poniższej metody, aby uzyskać aktualny znacznik czasu. Działa dla mnie dobrze.
źródło
To proste użycie:
jeśli chcesz mieć konkretny format, potrzebujesz Formattera jak poniżej
źródło
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:
źródło
Spróbuj tych
i timeStamp do formatu czasu
źródło
java.time
Chciałbym przekazać nowoczesną odpowiedź.
Dane wyjściowe po uruchomieniu:
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ąć.
Instant
Klasa 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: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 .
org.threeten.bp
z podpakietów.Spinki do mankietów
java.time
.java.time
został po raz pierwszy opisany.java.time
do Java 6 i 7 (ThreeTen dla JSR-310).źródło
Rozwiązanie w Kotlin:
Upewnij się, że minimalna wersja zestawu SDK to 26.
źródło
Sugeruję użycie odpowiedzi Hitsa, ale dodając format ustawień regionalnych, tak programiści Androida zalecają :
źródło
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
Myślę, że lepiej będzie użyć tego kodu, niż zależy od wersji Androida 26 lub wyższej
źródło