Mam następujące daty: 2011-08-12T20:17:46.384Z
. Jaki to format? Próbuję parsować go za pomocą Java 1.4 przez DateFormat.getDateInstance().parse(dateStr)
i otrzymuję
java.text.ParseException: Nieodłączna data: „2011-08-12T20: 17: 46.384Z”
Myślę, że powinienem używać SimpleDateFormat do analizowania, ale najpierw muszę znać ciąg formatu. Do tej pory yyyy-MM-dd
mam tylko to , ponieważ nie wiem, co T
oznacza ten ciąg - coś związanego ze strefą czasową? Ten ciąg daty pochodzi z lcmis:downloadedOn
tagu pokazanego na typ nośnika Historia pobierania plików CMIS .
Z
końcu jest skrótZulu
i oznacza UTC . Ten format z pewnością należy do kolekcji standardowych formatów tekstowych daty i godziny ISO 8601 . Nawiasem mówiąc, te standardowe formaty są domyślnie używane w klasach java.time .java.util.Date
,java.util.Calendar
ijava.text.SimpleDateFormat
są już starsze , zastąpione przez klasy java.time wbudowane w Javę 8 i Javę 9. Zobacz samouczek Oracle .Odpowiedzi:
T jest po prostu literałem oddzielającym datę od godziny, a Z oznacza „przesunięcie godziny zero” znane również jako „czas Zulu” (UTC). Jeśli ciągi zawsze mają „Z”, możesz użyć:
Lub używając Joda Time , możesz użyć
ISODateTimeFormat.dateTime()
.źródło
T
iZ
?T
(nie pamiętam, jak SimpleDateFormat obsługuje nieznane specyfikatory), aleZ
chcemy, aby był to znak „Z”, a nie „wartość przesunięcia UTC” (np. „00”).tl; dr
Łańcuch wejściowy wykorzystuje standardowy format ISO 8601 .
ISO 8601
Ten format jest określony przez rozsądną praktyczną normę ISO 8601 .
T
Oddziela część datę z części pomiaru czasu dnia.Z
W końcu oznacza UTC (to jest, przesunięciem-z UTC godzinach zero minutowa sekund).Z
Jest wymawiane „Zulu” .java.time
Stare klasy daty i czasu w pakiecie z najwcześniejszymi wersjami Javy okazały się źle zaprojektowane, zagmatwane i kłopotliwe. Unikaj ich.
Zamiast tego użyj środowiska java.time wbudowanego w Javę 8 i nowsze wersje . Klasy java.time zastępują zarówno stare klasy daty i godziny, jak i bardzo udaną bibliotekę Joda-Time.
Klasy java.time domyślnie używają ISO 8601 podczas analizowania / generowania tekstowych reprezentacji wartości daty i godziny.
Instant
Klasa reprezentuje moment na osi czasu w UTC z rozdzielczością nanosekund . Ta klasa może bezpośrednio analizować ciąg wejściowy bez zawracania sobie głowy definiowaniem wzorca formatowania.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 .
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
Nie jestem pewien co do analizy Java, ale to ISO8601: http://en.wikipedia.org/wiki/ISO_8601
źródło
Istnieją inne sposoby jego przeanalizowania niż pierwsza odpowiedź. Aby to parsować:
(1) Jeśli chcesz pobrać informacje o dacie i godzinie, możesz parsować je do
ZonedDatetime
(od Java 8 ) lubDate
(starego) obiektu:lub
(2) Jeśli nie obchodzi Cię data i godzina i po prostu chcesz traktować informacje jako chwilę w nanosekundach, możesz użyć
Instant
:źródło
Jeśli szukacie rozwiązania dla Androida, możecie użyć następującego kodu, aby uzyskać epokę sekund od ciągu znacznika czasu.
Przykładowe dane wejściowe: 2019-10-15T05: 51: 31.537979Z
Przykładowe dane wyjściowe: 1571128673
źródło
Możesz użyć następującego przykładu.
źródło
Z
. To oznacza oczekiwać, ale zignorować ten list. Ale tego listu nie należy ignorować. Ta litera dostarcza cennych informacji, ponieważ ciąg był przeznaczony dla UTC, przesunięcie zerowe. Twój format odrzuca ten ważny fakt. Co więcej, nie trzeba nawet zawracać sobie głowy definiowaniem tego wzorca formatowania. Wbudowany jest formatyzator dla tego wzoru.Ta technika tłumaczy java.util.Date na format UTC (lub dowolny inny) iz powrotem.
Zdefiniuj klasę tak:
}
Następnie użyj go w następujący sposób:
lub
Możesz także zdefiniować inne formaty dat, jeśli potrzebujesz (nie tylko UTC)
źródło
java.util.Date
projekt Joda-Time został wyparty wiele lat temu przez nowoczesne klasy java.time zdefiniowane w JSR 310. Ta rada jest od dawna nieaktualna.@ John-Skeet dał mi wskazówkę, że mogę rozwiązać mój własny problem. Jako młodszy programista ten niewielki problem jest łatwy do przeoczenia i trudny do zdiagnozowania. Więc dzielę się tym w nadziei, że to komuś pomoże.
Mój problem polegał na tym, że chciałem przeanalizować następujący ciąg zawierający znacznik czasu z JSON, na który nie mam wpływu, i umieścić go w bardziej przydatnych zmiennych. Ale ciągle pojawiały się błędy.
Biorąc pod uwagę następujące (należy zwrócić uwagę na parametr string wewnątrzPattern ();
Błąd:
Problem? Z na końcu Wzorca musi być zawinięte w „Z” tak jak „T”. Zmień
"yyyyMMdd'T'HHmmss.SSSZ"
na"yyyyMMdd'T'HHmmss.SSS'Z'"
i to działa.Całkowite usunięcie Z ze wzoru również doprowadziło do błędów.
Szczerze mówiąc, spodziewałbym się, że klasa Java to przewidziała.
źródło
T
jest dosłowny i wymaga cytowania,Z
jest przesunięciem (zerem) i musi zostać przeanalizowany jako taki, w przeciwnym razie otrzymasz błędne wyniki. Nie wiem, co masz na myśli, że nie zostało to przewidziane, wierzę, że tak.Z
. Odrzucasz cenne informacje. Przetwarzanie wartości daty i godziny przy ignorowaniu strefy czasowej lub przesunięciu względem UTC jest jak przetwarzanie kwoty pieniędzy przy ignorowaniu waluty!T
Jedynie oddziela część datę z części czasu w dzień, i dodaje żadnego znaczenia. ZZ
drugiej strony zdecydowanie dodaje znaczenia.