Как получить дату и время от UT C даты и времени? - PullRequest
0 голосов
/ 18 февраля 2020

Я получаю дату и время от остальных API, как показано ниже "2020-02-13T16: 57: 13.04. Как я могу конвертировать в java для android? Так что я могу использовать только дату или время отдельно?

Я пытался таким способом

String dateStr = rowsArrayList.get(position).getDisplayDate();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.ENGLISH);
df.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = null;
try {
    date = df.parse(dateStr);
    df.setTimeZone(TimeZone.getDefault());
    String formattedDate = df.format(date);
    Log.d("testDate",formattedDate);

} catch (ParseException e) {
    e.printStackTrace();
    Log.d("testDate",e.toString());
}

Но получаю ошибку

java .text.ParseException: Неразборчивая дата: "2020-02-13T16 : 57: 13.04 "

Ответы [ 4 ]

2 голосов
/ 18 февраля 2020
  1. SimpleDateFormat не может правильно проанализировать вашу строку даты и времени.
  2. SimpleDateFormat общеизвестно хлопотно и давно устарело. Ни для этого, ни для каких-либо других целей вы не должны использовать его. Вместо этого просто используйте класс LocalDateTime из java .time, современный Java API даты и времени. Он анализирует вашу строку без какого-либо явного средства форматирования.

Вы не можете с SimpleDateFormat

В вашей строке два знака после запятой на секунду минуты, .04, что означает 4 сотых второй. SimpleDateFormat поддерживает только три десятичных знака в секундах, а не два или четыре или любое другое число. Таким образом, нет способа, которым он может правильно проанализировать вашу строку.

java .time

Похоже, вы предполагаете, что строка, которую вы анализируете, находится в UT C, и вы хотите преобразовать его в часовой пояс по умолчанию вашего устройства. Ваша строка имеет формат ISO 8601, формат, который классы java .time анализируют как значения по умолчанию, поэтому нам не нужно указывать какой-либо форматер.

    String dateStr = "2020-02-13T16:57:13.04";
    LocalDateTime dateTime = LocalDateTime.parse(dateStr);
    ZonedDateTime inDefaultTimeZone = dateTime.atOffset(ZoneOffset.UTC)
            .atZoneSameInstant(ZoneId.systemDefault());
    System.out.println(inDefaultTimeZone);

На моем компьютере в Европе / Часовой пояс Копенгагена выводит из этого фрагмента:

2020-02-13T17: 57: 13.040 + 01: 00 [Европа / Копенгаген]

Вопрос: не ' t java .time требует Android API-уровень 26?

java .time прекрасно работает как на старых, так и на новых Android устройствах. Для этого требуется как минимум Java 6 .

  • В Java 8 и более поздних версиях, а также на более новых Android устройствах (от уровня API 26) современный встроенный API -in.
  • В не- Android Java 6 и 7 получите ThreeTen Backport, бэкпорт современных классов (ThreeTen для JSR 310; см. ссылки внизу).
  • Вкл. (Более старая версия) Android используйте редакцию ThreeTen Backport Android. Это называется ThreeTenABP. И убедитесь, что вы импортируете классы даты и времени из org.threeten.bp с подпакетами.

Ссылки

2 голосов
/ 18 февраля 2020

Используйте yyyy-MM-dd'T'HH:mm:ss.SS в качестве формата вместо yyyy-MM-dd'T'HH:mm:ss'Z'

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SS", Locale.ENGLISH);

java .time

Этого также можно добиться с помощью java.time, современный Java API даты и времени , поскольку старые классы (Date, Calendar и SimpleDateFormat) имеют множество проблем и проблемы проектирования :

String sourceDateTime = "2020-02-13T16:57:13.04";
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SS").withZone(DateTimeZone.UTC);

LocalDateTime localDateTime = LocalDateTime.parse(sourceDateTime, dateTimeFormatter);

LocalDate localDate = localDateTime.toLocalDate();
LocalTime localTime = localDateTime.toLocalTime();

System.out.println(localDate.toString() + " -> " + localTime.toString());
//Output should be: 2020-02-13 -> 16:57:13.040

Вопрос: Могу ли я использовать java .time на Android?

  • С Android 8.0 ( Уровень API 26 ) современный API поставляется встроенным.
  • Для более старой версии android можно использовать ThreeTenABP , Android редакцию ThreeTen Backport
1 голос
/ 18 февраля 2020

Извлеките 'Z' в строке формата

Это должно работать:

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.ENGLISH);

Или, если вы хотите оставить миллисекунды, используйте SS:

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SS", Locale.ENGLISH);
0 голосов
/ 18 февраля 2020
String dateStr = "Jul 16, 2013 12:08:59 AM";
SimpleDateFormat df = new SimpleDateFormat("MMM dd, yyyy HH:mm:ss a", Locale.ENGLISH);
df.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = df.parse(dateStr);
df.setTimeZone(TimeZone.getDefault());
String formattedDate = df.format(date);
...