У меня есть следующая дата: 2011-08-12T20:17:46.384Z
. Что это за формат? Я пытаюсь разобрать ее с помощью Java 1.4 через DateFormat.getDateInstance().parse(dateStr)
и получаю
java.text.ParseException: Unparseable date: "2011-08-12T20:17:46.384Z"
Я думаю, что мне следует использовать SimpleDateFormat для разбора, но сначала я должен знать строку формата. Пока у меня есть только yyyy-MM-dd
, потому что я не знаю, что означает T
в этой строке - что-то связанное с часовым поясом? Эта строка даты исходит из тега lcmis:downloadedOn
, показанного на Files CMIS download history media type.
@John-Skeet дал мне ключ к разгадке для устранения моей собственной проблемы вокруг этого. Как младший программист эту маленькую проблему легко пропустить и трудно диагностировать. Таким образом, я совместно использую его в надеждах, это поможет кому-то.
Моя проблема была то, что я хотел проанализировать следующую строку, ограничивающую метку времени от JSON, я не имею никакого влияния и помещаю ее в более полезные переменные. Но я продолжал получать ошибки.
Так, учитывая следующее (обращают внимание на строковый параметр внутри ofPattern ();
String str = "20190927T182730.000Z"
LocalDateTime fin;
fin = LocalDateTime.parse( str, DateTimeFormatter.ofPattern("yyyyMMdd'T'HHmmss.SSSZ") );
Ошибка:
Exception in thread "main" java.time.format.DateTimeParseException: Text
'20190927T182730.000Z' could not be parsed at index 19
проблема? Z в конце Шаблона должен быть перенесен в 'Z' точно так же, как 'T'. Изменение "yyyyMMdd'T'HHmmss.SSSZ"
к "yyyyMMdd'T'HHmmss.SSS'Z'"
и это работает.
Удаление Z от шаблона, в целом также ведомого к ошибкам.
Откровенно говоря, я ожидал бы, что класс Java будет ожидать это.
Если Вы, парни ищут решение для Android, можно использовать следующий код для получения секунд эпохи от строки метки времени.
public static long timestampToEpochSeconds(String srcTimestamp) {
long epoch = 0;
try {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
Instant instant = Instant.parse(srcTimestamp);
epoch = instant.getEpochSecond();
} else {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSSSSS'Z'", Locale.getDefault());
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = sdf.parse(srcTimestamp);
if (date != null) {
epoch = date.getTime() / 1000;
}
}
} catch (Exception e) {
e.printStackTrace();
}
return epoch;
}
Демонстрационный вход: Демонстрационный вывод 2019-10-15T05:51:31.537979Z
: 1571128673