ISO 8601
Jak kilka innych odpowiedzi wymienionych, format daty i godziny w pytaniu jest zdefiniowany przez RFC 4517 Lightweight Directory Access Protocol (LDAP): Syntaxes and Matching Rules. Patrz sekcja 3.3.13, Czas ogólny.
W tej sekcji wyjaśniono, że ten format LDAP jest ograniczoną wersją jednego z formatów daty i czasu zdefiniowanego przez ISO 8601. Ten styl używając minimum separatorów jest znany jako „podstawowe” w ISO 8601.
W tych formatów The Z
na końcu jest skrótem Zulu
i oznacza UTC (w zasadzie taki sam jak GMT).
Kropka dziesiętna i cyfra na końcu reprezentują ułamek sekundy. Zauważ, że zamiast kropki (kropki) możliwy jest przecinek zarówno w RFC 4517, jak i ISO 8601. Przecinek jest rzeczywiście zalecany do kropki w ISO 8601. Specyfikacja RFC 4517 dopuszcza tylko jednocyfrowe ułamki (niektóre dziesiąte ułamka) lub żadna kropka/przecinek & cyfra w ogóle. Zauważ, że w przeciwieństwie: (a) ISO 8601 pozwala na dowolną liczbę cyfr ułamkowych, a (b) obiekty java.time mają nanosekundową rozdzielczość dla maksymalnie dziewięciu cyfr ułamkowej sekundy.
java.time
Ramy java.time jest wbudowana w Java 8 i późniejszych. Klasy te zastępują stare, kłopotliwe klasy czasu i daty, takie jak java.util.Date
, .Calendar
, java.text.SimpleDateFormat
.
Teraz w maintenance mode, projekt Joda-Time zaleca również migrację do java.time. Aby uzyskać więcej informacji, zobacz
. I wyszukaj Stack Overflow dla wielu przykładów i objaśnień.
Znaczna część funkcjonalności java.time powraca walcowy Java 6 & 7 w ThreeTen-Backport i ponadto dostosowany do Android w ThreeTenABP.
Projekt ThreeTen-Extra rozszerza java.time o dodatkowe klasy. Ten projekt jest poligonem wskazującym na możliwe przyszłe dodatki do java.time.
Przetwarzanie
Zdefiniuj wzorzec formatowania, aby pasowały RFC 4517. Study klasę DateTimeFormatter
za wzorzec kodowania. To powinno działać: uuuuMMddHHmmss[,S][.S]X
. Nawiasy kwadratowe oznaczają opcjonalnie. Możemy pomieścić kropkę lub przecinek. Zwróć uwagę na liczbę pojedynczą ułamka sekundy. Model X
na końcu umożliwia albo Z
albo offset-from-UTC, taki jak -08 lub -0830 lub -08: 30 lub -083015 lub -08: 30: 15.
String input = "20090813145607.0Z";
DateTimeFormatter f = DateTimeFormatter.ofPattern ("uuuuMMddHHmmss[,S][.S]X");
OffsetDateTime odt = OffsetDateTime.parse (input , f);
Instant instant = odt.toInstant();
Zrzut na konsolę.
System.out.println ("input: " + input + " | odt: " + odt + " | instant: " + instant);
wejściowe: 20090813145607.0Z | odt: 2009-08-13T14: 56: 07Z | natychmiastowy: 2009-08-13T14: 56: 07Z
Oczywiście należy również być kodowanie czek na java.time.format.DateTimeParseException
w przypadku niespodziewanego wejścia.
Nie jestem pewien, co dokładne znaczenie '.0Z' jest i jak data jest pochodzący z I don LDAP nie wiem, czy to może się zmienić w przyszłości. Nie wiedziałbym, co jeszcze można przetestować, jednak powinien to być standard LDAP i być zgodny z jednym z programów rfcs. http://msdn.microsoft.com/en-us/library/windows/desktop/ms680924%28v=vs.85%29.aspx –
NOPE - ".0" nie ma nic wspólnego ze strefą czasową. "Z" oznacza czas Zulu (UTC) - koniec historii. ".0" po sekundach oznacza sekundy dziesiętne. A więc pięćdziesiąt dziewięć i pół sekundy po południu może wyglądać jak "yyyymmdd120059.5Z". Zobacz odpowiedź "ISO 8601" poniżej @Basil Borrque, aby uzyskać więcej szczegółów. –