Дата, полученная с сервера, не фиксируется в определенном формате, тогда как я могу определить, какой формат получаю, чтобы я мог преобразовать его в определенный формат даты и отобразить в приложении в соответствии с функциональностью.
Вот несколько примеров, которые я получаю:
2018-09-10T10:35:00.377Z
2018-09-10T10:35:00.12Z
2018-09-10
Заранее спасибо!
На самом деле мне нужно отображать 3-4 варианта на разных экранах в зависимости от функциональности, и это не имеет большого значения, но главное - определить формат ввода.
"yyyy-MM-dd'T'HH: mm: ss.SSSZ" Прочитать строку и подстроку и проверить соответствие шаблону. Попробуйте определить все шаблоны, которые вы можете получить от сервера.
Спасибо @ Ankita-user3449434, я уже пробовал это, и он работает только тогда, когда дата ввода находится в формате "yyyy-MM-dd'T'HH: mm: ss.SSSZ" и приложение аварийно завершает работу, когда формат отличается от "yyyy-" MM-dd'T'HH: mm: ssZ "
Например, я хочу знать о каком-либо методе по умолчанию для проверки формата даты ввода?
Возможный почти дубликат DateTimeFormatter принимает несколько дат и конвертирует в одну (библиотека java.time) и другие вопросы.
В ваших форматах разрешены варианты ISO 8601. java.time, современный API даты и времени Java, анализирует эти форматы без какого-либо явного средства форматирования. Если ваша строка содержит T
, используйте OffsetDateTime.parse()
с одним аргументом, в противном случае - LocalDate.parse()
с одним аргументом.
Когда вы говорите «дата», означает ли это, что вам не нужна временная часть, которая есть в некоторых из ваших примеров строк?
@ OleV.V. Думаю, я не уверен в возможностях, поэтому удаляю свой ответ, чтобы не запутать ЗП.
@ OleV.V. Да, мне нужна временная часть для какой-то функции сортировки.
String[] exampleStrings = {
"2018-09-10T10:35:00.377Z",
"2018-09-10T10:35:00.12Z",
"2018-09-10"
};
for (String example : exampleStrings) {
if (example.contains("T")) {
OffsetDateTime dateTime = OffsetDateTime.parse(example);
System.out.println("Date: " + dateTime.toLocalDate()
+ " Time: " + dateTime.toLocalTime()
+ " Offset: " + dateTime.getOffset());
} else {
LocalDate date = LocalDate.parse(example);
System.out.println("Date: " + date);
}
}
Ваши форматы являются допустимыми вариантами ISO 8601. java.time, современный API даты и времени Java, анализирует эти форматы без какого-либо явного средства форматирования. Первые две примерные строки содержат дату и время и характеристику T
для их разделения, а также смещение от UTC (Z
означает смещение 0). У третьего есть только свидание. Поэтому проверьте, есть ли в строке T
, а для остальных используйте соответствующий класс java.time.
Вывод из приведенного выше фрагмента:
Date: 2018-09-10 Time: 10:35:00.377 Offset: Z
Date: 2018-09-10 Time: 10:35:00.120 Offset: Z
Date: 2018-09-10
Я не знаю, как вы будете обрабатывать два разных типа OffsetDateTime
и LocalDate
в остальной части вашего кода. Если вам не нужна часть времени, а только дата, используйте dateTime.toLocalDate()
, чтобы получить LocalDate
, и просто передавайте этот тип во всех случаях. Поскольку вам действительно нужна временная часть, вы можете, в зависимости от вашей ситуации и требований, обойтись обратным преобразованием: в случае даты вы можете получить OffsetDateTime
, например, от date.atStartOfDay().atOffset(ZoneOffset.UTC)
, но, пожалуйста, проверьте, дает ли это подходящее время .
Однако я согласен с теперь удаленным ответом Хемраджа, что ваш сервер должен иметь возможность предоставлять один согласованный формат или, по крайней мере, указывать, какой формат он вам дает.
Да, java.time
прекрасно работает на старых и новых устройствах Android. Просто требуется как минимум Java 6.
org.threeten.bp
с подпакетами.java.time
.java.time
.java.time
на Java 6 и 7 (ThreeTen для JSR-310).
как вы хотите отображать вывод ??