Jaki jest ten format daty? 2011-08-12T20:17:46.384 Z
Mam następującą datę: 2011-08-12T20:17:46.384Z
. Co to za format? Próbuję to przetworzyć za pomocą Javy 1.4 przez DateFormat.getDateInstance().parse(dateStr)
i otrzymuję
Java.tekst.ParseException: Unparseable date: "2011-08-12t20:17:46.384 z"
Myślę, że powinienem używać SimpleDateFormat do parsowania, ale najpierw muszę znać format. Na razie mam tylko yyyy-MM-dd
, Bo Nie wiem co T
oznacza w tym łańcuchu-coś związanego ze strefą czasową? Ten ciąg daty jest pochodzi z znacznika lcmis:downloadedOn
pokazanego na plikach typ nośnika historii pobierania CMIS .
5 answers
T jest tylko dosłownym znakiem oddzielającym datę od czasu, a Z oznacza " przesunięcie godziny zerowej "znane również jako" czas Zulu " (UTC). Jeśli Twoje stringi Zawsze mają "Z" możesz użyć:
SimpleDateFormat format = new SimpleDateFormat(
"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US);
format.setTimeZone(TimeZone.getTimeZone("UTC"));
Lub używając Joda Time , możesz użyć ISODateTimeFormat.dateTime()
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-13 07:41:31
Tl;dr
Standard ISO 8601 format jest używany przez ciąg wejściowy.
Instant.parse ( "2011-08-12T20:17:46.384Z" )
ISO 8601
Ten format jest zdefiniowany przez sensowny praktyczny standard, ISO 8601 .
T
oddziela porcję daty od porcji pory dnia. Z
na końcu jest skrótem od Zulu
i oznacza UTC .
Java.CZAS
Stare klasy date-time połączone z najwcześniejszymi wersjami Javy okazały się źle zaprojektowane, mylące i kłopotliwe. Unikaj ich.
Zamiast tego użyj java.time framework wbudowany w Javę 8 i późniejsze. Java.klasy czasu zastępują zarówno stare klasy daty i czasu, jak i bardzo udaną bibliotekę czasu Joda.
Java.klasy czasu używają ISO 8601 domyślnie podczas parsowania / generowania tekstowych reprezentacji wartości data-czas.
The Instant
Klasa reprezentuje moment na osi czasu w UTC z rozdzielczość nanosekund . Ta klasa może bezpośrednio parsować Twój łańcuch wejściowy bez zawracania sobie głowy definiowaniem wzorca formatowania.
Instant instant = Instant.parse ( "2011-08-12T20:17:46.384Z" ) ;
O Javie.czas
The java.czas framework jest wbudowany w Java 8 i nowsze. Klasy te zastępują kłopotliwe staredziedzictwo klasy date-time, takie jak java.util.Date
, Calendar
, & SimpleDateFormat
.
The Joda-czas Projekt, teraz w trybie konserwacji, zaleca migrację do java.CZAS klasy.
Aby dowiedzieć się więcej, Zobacz samouczek Oracle. I wyszukaj przepełnienie stosu dla wielu przykładów i wyjaśnień. Specyfikacja to JSR 310 .
Skąd pobrać Javę.zajęcia czasowe?
-
Java SE 8, Java SE 9, i Później
- Wbudowany.
- część standardowego API Java z wiązana implementacja.
- Java 9 dodaje kilka drobnych funkcji i poprawek.
-
Java SE 6 oraz Java SE 7
- Większość Javy.funkcja czasu powraca-przeportowana do Javy 6 i 7 w ThreeTen-Backport.
-
Android
-
[[90]}późniejsze wersje implementacji pakietu Android java.zajęcia czasowe.
- na wcześniej Android, the ThreeTenABP projekt adaptuje ThreeTen-Backport (wspomniany powyżej). Zobacz też Jak stosować ThreeTenABP....
The ThreeTen-Extra projekt rozszerza Javę.czas z dodatkowymi zajęciami. Ten projekt jest poligonem dla potencjalnych przyszłych dodatków do Javy.czas. Możesz znaleźć tutaj kilka przydatnych klas, takich jak Interval
, YearWeek
, YearQuarter
, i więcej .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-03 00:48:00
Nie jestem pewien co do parsowania Javy, ale to ISO8601: http://en.wikipedia.org/wiki/ISO_8601
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-06 18:48:39
Są inne sposoby analizy, a nie pierwsza odpowiedź. Aby go przeanalizować:
(1) jeśli chcesz pobrać informacje o dacie i czasie, możesz je przetworzyć do ZonedDatetime
(od Java 8) lub Date
(old) obiektu:
// ZonedDateTime's default format requires a zone ID(like [Australia/Sydney]) in the end.
// Here, we provide a format which can parse the string correctly.
DateTimeFormatter dtf = DateTimeFormatter.ISO_DATE_TIME;
ZonedDateTime zdt = ZonedDateTime.parse("2011-08-12T20:17:46.384Z", dtf);
Lub
// 'T' is a literal.
// 'X' is ISO Zone Offset[like +01, -08]; For UTC, it is interpreted as 'Z'(Zero) literal.
String pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSX";
// since no built-in format, we provides pattern directly.
DateFormat df = new SimpleDateFormat(pattern);
Date myDate = df.parse("2011-08-12T20:17:46.384Z");
(2) Jeśli nie zależy ci na dacie i godzinie i chcesz traktować informacje jako moment w nanosekundach, możesz użyć Instant
:
// The ISO format without zone ID is Instant's default.
// There is no need to pass any format.
Instant ins = Instant.parse("2011-08-12T20:17:46.384Z");
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-27 08:10:44
Łatwym sposobem rozwiązania tego problemu jest zastąpienie "T"
z " "
i usunąć .384Z
.
Poniżej znajduje się ilustracja jak to osiągnąć:
public static String getTime(String time) {
if (time != null) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
if (time.toUpperCase().contains("T") && time.toUpperCase().contains("Z")) {
time = time.toUpperCase().replace("T", " ");
String[] str = time.split("\\.");
if (str.length != 0) {
return str[0];
}
}
try {
Date date = new Date(time);
time = simpleDateFormat.format(date);
} catch (Exception e) {
//
}
}
return time;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-12 12:48:58