Muszę przekonwertować uniksowy znacznik czasu na obiekt daty.
Próbowałem tego:
java.util.Date time = new java.util.Date(timeStamp);
Wartość znacznika czasu wynosi: 1280512800
Data powinna wynosić „2010/07/30 - 22:30:00” (tak jak otrzymuję to przez PHP), ale zamiast tego dostaję Thu Jan 15 23:11:56 IRST 1970
.
Jak należy to zrobić?
java.util.Date
teraz, są starsze , wyparte przez klasy java.time . Zobacz samouczek Oracle .Odpowiedzi:
Dla
1280512800
pomnożyć przez 1000, ponieważ java spodziewa milisekund:Jeśli masz już milisekundy, to po prostu
new java.util.Date((long)timeStamp);
Z dokumentacji :
źródło
(long)
jest bardzo ważne: bez niego liczba całkowita przepełnia się.java.util.Date
to w pełni kwalifikowana nazwa klasy.Date
jest prawdopodobnie dokładnie tak samo, pod warunkiem, że zaimportujeszjava.util
pakiet do swojej klasy.Date time = new Date(TimeUnit.MILLISECONDS.convert(unixTimestamp, TimeUnit.SECONDS));
java.util.Date
teraz, są starsze , wyparte przez klasy java.time . Zobacz samouczek Oracle .java.time
Java 8 wprowadziła nowy interfejs API do pracy z datami i godzinami: pakiet java.time .
Dzięki java.time możesz przeanalizować liczbę sekund od odniesienia do pierwszej chwili 1970 roku w UTC, 1970-01-01T00: 00Z. Rezultatem jest
Instant
.Jeśli potrzebujesz
java.util.Date
do współpracy ze starym kodem, który nie został jeszcze zaktualizowany dla java.time , przekonwertuj. Wywołaj nowe metody konwersji dodane do starych klas.źródło
java.util.Date
. Stare klasy są dziedzictwem i należy ich unikać. Chociaż rzeczywiście można konwertować do klas starszych i java.time, najlepiej trzymać java.time, gdy tylko jest to możliwe.To jest właściwy sposób:
źródło
Wygląda na to, że Kalendarz to nowy sposób:
Ostatni wiersz to tylko przykład, jak go użyć, ten wydrukuje np. „14.06.2012”.
Jeśli użyłeś System.currentTimeMillis () do zapisania znacznika czasu, nie potrzebujesz części „* 1000”.
Jeśli masz znacznik czasu w ciągu, musisz go najpierw przeanalizować jako długi: Long.parseLong (znacznik czasu).
https://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html
źródło
timestamp
jest liczbą całkowitą, musisz ją przerzucić na(long)
pierwszą, w przeciwnym razie skończy się to z niewłaściwymi datami.mydate.setTimeInMillis((long) timestamp*1000);
java.util.Date
,java.util.Calendar
ijava.text.SimpleDateFormat
są teraz spuścizną , wyparte przez klasy java.time wbudowane w Javę 8 i nowsze wersje . Zobacz samouczek Oracle .tl; dr
java.time
Nowa platforma java.time wbudowana w Javę 8 i późniejszą jest następcą Joda-Time.
Te nowe klasy obejmują przydatną fabryczną metodę konwersji liczby sekund z epoki. Dostajesz
Instant
chwilę na osi czasu w UTC z rozdzielczością do nanosekund.Zobacz, jak kod działa na żywo w IdeOne.com .
Asia/Kabul
czyAsia/Tehran
strefy czasowe?Zgłosiłeś, że otrzymałeś wartość dnia 22:30 zamiast 18:00 tutaj. Podejrzewam, że twoje narzędzie PHP domyślnie stosuje domyślną strefę czasową do dostosowania z UTC. Moja wartość tutaj to UTC, oznaczony przez
Z
(skrótZulu
oznacza UTC). Jest jakaś szansa, urządzenie OS lub PHP jest ustawionyAsia/Kabul
lubAsia/Tehran
strefy czasowe? Podejrzewam, że tak, jak informujeszIRST
w swoich pracach, co najwyraźniej oznacza czas Iranu. Obecnie w 2017 r. Są to jedyne strefy działające w okresie letnim, który jest o cztery i pół godziny przed UTC.Określ prawidłową nazwę strefy czasowej w formacie
continent/region
, takie jakAmerica/Montreal
,Africa/Casablanca
lubPacific/Auckland
. Nigdy nie używać skrótu 3-4 siÄ takich jakEST
lubIST
czyIRST
są one nie prawdziwe strefy czasowe, niestandardowe, a nawet unikatowe (!).Jeśli chcesz zobaczyć swoją chwilę przez soczewkę strefy czasowej określonego regionu, zastosuj a,
ZoneId
aby uzyskaćZonedDateTime
. Wciąż ten sam jednoczesny moment, ale postrzegany jako inny czas naścienny .Konwersja z java.time na starsze klasy
Powinieneś trzymać się nowych klas java.time. Ale w razie potrzeby możesz zmienić na stary.
Joda-Time
AKTUALIZACJA: Projekt Joda-Time jest teraz w trybie konserwacji , a zespół doradza migrację do klas java.time .
Do Twojej wiadomości, konstruktor JTA-Time DateTime jest podobny: pomnóż przez tysiąc, aby utworzyć
long
(nie anint
!).Najlepiej, aby uniknąć kłopotliwych klas java.util.Date i .Calendar. Ale jeśli musisz użyć Daty, możesz dokonać konwersji z Joda-Time.
O java.time
Środowisko java.time jest wbudowane w Javę 8 i nowsze wersje . Klasy te kłopotliwe zastąpić stary starszych klas Date-Time, takich jak
java.util.Date
,Calendar
, iSimpleDateFormat
.Projekt Joda-Time , teraz w trybie konserwacji , zaleca migrację do klas java.time .
Aby dowiedzieć się więcej, zobacz samouczek Oracle . I przeszukaj stos przepełnienia dla wielu przykładów i wyjaśnień. Specyfikacja to JSR 310 .
Możesz wymieniać obiekty java.time bezpośrednio ze swoją bazą danych. Użyj sterownika JDBC zgodnego z JDBC 4.2 lub nowszym. Nie potrzeba ciągów, nie ma potrzeby
java.sql.*
klas.Gdzie można uzyskać klasy java.time?
Projekt ThreeTen-Extra rozszerza java.time o dodatkowe klasy. Ten projekt jest poligonem doświadczalnym dla ewentualnych przyszłych dodatków do java.time. Można znaleźć kilka przydatnych klas tutaj takie jak
Interval
,YearWeek
,YearQuarter
, i więcej .źródło
Konstruktor daty oczekuje, że wartość timeStamp będzie wyrażona w milisekundach. Pomnóż wartość znacznika czasu przez 1000, a następnie przekaż konstruktorowi.
źródło
Jeśli konwertujesz wartość znacznika czasu na innym komputerze, powinieneś również sprawdzić strefę czasową tego komputera. Na przykład;
Powyższe odszyfrowania przyniosą różne wartości Daty, jeśli uruchomisz w strefach czasowych EST lub UTC.
Aby ustawić strefę czasową; znany też jako UTC, możesz po prostu przepisać;
źródło
Dla kotlina
źródło
Czasami musisz pracować z dostosowaniami.
Nie używaj obsady zbyt długo! Użyj nanoregulacji.
Na przykład, używając Oanda Java API do handlu, możesz uzyskać datetime w formacie UNIX.
Na przykład: 1592523410.590566943
dostajesz:
Użyj również:
źródło
źródło