Mam listę z długimi wartościami (na przykład: 1220227200, 1220832000, 1221436800 ...), które pobrałem z serwisu internetowego. Muszę przekonwertować go na daty. Niestety w ten sposób na przykład:
Date d = new Date(1220227200);
zwraca 1 stycznia 1970. Czy ktoś zna inny sposób na poprawną konwersję?
java
date
long-integer
mmmiki
źródło
źródło
java.util.Date
,java.util.Calendar
ijava.text.SimpleDateFormat
są teraz starsze , zastąpione przez klasy java.time wbudowane w Javę 8 i nowsze.Odpowiedzi:
Date
Konstruktor (kliknij w link!) Przyjmuje jako czaslong
w milisekundach , a nie sekundach. Musisz go pomnożyć przez 1000 i upewnić się, że podałeś jakolong
.To widać tutaj
źródło
Date d = new Date(TimeUnit.SECONDS.toMillis(1220227200L));
do czystszego i mniej magicznego rozwiązania.tl; dr
Poznaj swoje dane
Ludzie używają różnych dokładności w śledzeniu czasu jako liczby od epoki . Więc kiedy otrzymasz kilka liczb, które mają być zinterpretowane jako liczba od epoki, musisz określić:
W różnych systemach używano dat z wielu epok . Powszechnie używany jest czas POSIX / Unix , gdzie epoka to pierwsza chwila 1970 roku w UTC. Ale nie powinieneś zakładać tej epoki.
Czy mówimy o sekundach, milisekundach , mikrosekundach czy nanosekundach od epoki?
Zwykle licznik, ponieważ epoka jest w strefie czasowej UTC / GMT, to znaczy w ogóle nie ma przesunięcia strefy czasowej. Ale czasami, gdy angażujemy niedoświadczonych lub nie znających się na czasie programistów, może istnieć domniemana strefa czasowa.
W twoim przypadku, jak zauważyli inni, wydaje się, że od ery Uniksa dano ci kilka sekund. Ale przekazujesz te sekundy konstruktorowi, który oczekuje milisekund. Więc rozwiązaniem jest pomnożenie przez 1000.
Zdobyta wiedza:
Twoje dane
Twoje dane wydają się być w całych sekundach. Jeśli przyjmiemy epokę początku 1970 roku i przyjmiemy strefę czasową UTC, to
1,220,227,200
jest to pierwsza chwila pierwszego dnia września 2008 roku.Joda-Time
Klasy java.util.Date i .Calendar dołączone do języka Java są notorycznie kłopotliwe. Unikaj ich. Zamiast tego użyj biblioteki Joda-Time lub nowego pakietu java.time dołączonego do języka Java 8 (i zainspirowanego Joda-Time).
Zauważ, że w przeciwieństwie do juDate, a
DateTime
w Joda-Time naprawdę zna swoją przypisaną strefę czasową . W poniższym przykładzie kodu Joda-Time 2.4 zauważ, że najpierw analizujemy milisekundy przy użyciu domyślnego założenia UTC. Następnie, po drugie, przypisujemy strefę czasową Paryża do dostosowania. Ten sam moment na osi czasu Wszechświata, ale inny zegar ścienny . W celach demonstracyjnych ponownie dostosowujemy się do UTC. Prawie zawsze lepiej jest jawnie określić żądaną / oczekiwaną strefę czasową niż polegać na domyślnej wartości domyślnej (często jest to przyczyna problemów w pracy z datą i godziną).Potrzebujemy milisekund, aby skonstruować DateTime. Więc weź sekundy i pomnóż przez tysiąc. Zauważ, że wynik musi być 64-bitowy,
long
ponieważ przepełnilibyśmy 32-bitowyint
.Podaj tę liczbę milisekund do konstruktora. Ten konkretny konstruktor zakłada, że licznik pochodzi z uniksowej epoki 1970. Po zakończeniu konstrukcji dostosuj strefę czasową według potrzeb.
Użyj prawidłowych nazw stref czasowych , kombinacji kontynentu i miasta / regionu. Nigdy nie używaj kodów 3- lub 4-literowych,
EST
ponieważ nie są one ani znormalizowane, ani unikalne.W celu demonstracji ponownie ustaw strefę czasową.
Zrzuć na konsolę. Zwróć uwagę, jak różni się data w Montrealu, ponieważ nowy dzień zaczął się w Europie, ale jeszcze nie w Ameryce.
Po uruchomieniu.
java.time
Twórcy Joda-Time poprosili nas o migrację do jego zamiennika, frameworka java.time , tak szybko, jak będzie to wygodne. Chociaż Joda-Time jest nadal aktywnie wspierana, cały przyszły rozwój będzie się odbywał na klasach java.time i ich rozszerzeniach w projekcie ThreeTen-Extra.
Struktura czasu Java jest zdefiniowana przez JSR 310 i wbudowana w Javę 8 i nowszą. Klasy java.time zostały ponownie przeniesione do Javy 6 i 7 w projekcie ThreeTen-Backport oraz do systemu Android w projekcie ThreeTenABP .
Na
Instant
osi czasu znajduje się moment w UTC z rozdzielczością nanosekund. Jego epoka to pierwszy moment 1970 roku w UTC.Zastosuj przesunięcie od UTC,
ZoneOffset
aby uzyskać plikOffsetDateTime
.Jeszcze lepiej, jeśli jest znana, zastosuj strefę czasową,
ZoneId
aby uzyskaćZonedDateTime
.źródło
Wygląda na to, że długie sekundy to sekundy, a nie milisekundy. Konstruktor daty zajmuje milisekundy, więc
źródło
Ustaw czas tylko w młynach w obiekcie kalendarza
źródło
Prawdopodobnie są to sygnatury czasowe w sekundach, a nie w milisekundach, co jest wymagane dla konstruktora Java new Date (long). Po prostu pomnóż je przez 1000 i wszystko będzie dobrze.
źródło
Najprawdopodobniej długie wartości odpowiadają sygnaturom czasowym epoki , a wartości to:
1220227200 = Pon, 01 Wrz 2008 00:00:00 GMT
1220832000 = Pon, 08 Wrz 2008 00:00:00 GMT
1221436800 = pon., 15 września 2008 r. 00:00:00 GMT
Można przekonwertować te długie wartości na java.util.Date , biorąc pod uwagę fakt, że java.util.Date używa miliseków - jak wspomniano wcześniej, ale z pewną wadą - taką jak ta:
Teraz, aby poprawnie wyświetlić datę, można użyć java.text.DateFormat, jak pokazano poniżej:
Poniżej znajdują się wyniki wyświetlania przekonwertowanej wartości długiej do java.util.Date bez użycia i użycia DateFormat:
źródło
Spróbuj tego:
źródło
Spróbuj tego, dostosowując format daty.
Uwaga: sprawdź cykl 24-godzinny lub 12-godzinny.
źródło
1220227200 odpowiada 15 stycznia 1980 r. (I rzeczywiście new Date (1220227200) .toString () zwraca „Thu Jan 15 03:57:07 CET 1970”). Jeśli przekażesz długą wartość do daty, czyli przed 01/01/1970, w rzeczywistości zwróci ona datę 01/01/1970. Upewnij się, że wartości nie znajdują się w tej sytuacji (niższe niż 82800000).
źródło
Nowa data (liczba) zwraca datę, która
number
milisekundach po 1 stycznia 1970 r. Szanse, że format daty nie pokazuje godzin, minut i sekund, aby zobaczyć, że jest trochę po 1 stycznia 1970 r.Musisz przeanalizować datę zgodnie z prawidłowym routingiem analizy. Nie wiem, co to jest 1220227200, ale jeśli jest to kilka sekund po 1 stycznia 1970 r., Pomnóż to, aby uzyskać milisekundy. Jeśli tak nie jest, przekonwertuj go w jakiś sposób na milisekundy po 1970 r. (Jeśli chcesz nadal używać java.util.Date).
źródło
Pracuje dla mnie. Prawdopodobnie chcesz to pomnożyć przez 1000, ponieważ otrzymujesz sekundy z 1970 i musisz minąć milisekundy od 1 stycznia 1970
źródło