Строка ISO 8601 для объекта даты / времени в Android

У меня есть строка в стандартном формате ISO 8601, которая содержит дату и время, возвращаемые веб-службой, например так:

String dtStart = "2010-10-15T09:27:37Z"

Как мне передать это в объект, такой как время или дата? Сначала я хочу вывести его в другом формате, но позже мне нужно будет сделать с ним другие вещи (т.е., возможно, использовать в другом формате).

Ваше здоровье


person neildeadman    schedule 15.10.2010    source источник
comment
Аналогично: Преобразование строки, совместимой с ISO 8601, в java.util.Date   -  person Basil Bourque    schedule 23.05.2018


Ответы (5)


String dtStart = "2010-10-15T09:27:37Z";  
SimpleDateFormat  format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");  
try {  
    Date date = format.parse(dtStart);  
    System.out.println(date);  
} catch (ParseException e) {  
    e.printStackTrace();  
}

Это то, что вы ищете. Об этой проблеме есть существующее сообщение.

person Seitaridis    schedule 15.10.2010
comment
Большое спасибо, я смотрел здесь и через Google, но не нашел ничего, что делало бы то, что я хотел - person neildeadman; 15.10.2010
comment
Для всех поддерживаемые форматы даты: docs.oracle. com / javase / 6 / docs / api / java / text / - person nemesisfixx; 28.08.2014

Этот вопрос был задан в 2010 году, и тогда было правильно, что вам следует использовать либо SimpleDateFormat, либо Joda-Time. Это было давно. Сегодня используют

    Instant iStart = Instant.parse(dtStart);

Да вот так просто. Ваша строка имеет формат ISO 8601, а классы из java.time, современного API даты и времени Java, анализируют ISO 8601 без какого-либо явного средства форматирования. Instant - лишь один из таких классов.

Изменить: Вопрос: требуется Android API 26 - как насчет поддержки более старых версий?

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

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

Ссылки

person Ole V.V.    schedule 23.05.2018
comment
требуется Android API 26 - как насчет поддержки более старых версий? - person TootsieRockNRoll; 19.12.2019
comment
@ElJazouli Спасибо за вопрос. Я уже пытался осветить это, но знаю, что многие читатели пропускают эту часть. Как сделать понятнее? Я отредактировал соответствующий заголовок, но, возможно, этого недостаточно. - person Ole V.V.; 19.12.2019

Вы можете использовать Java-метод синтаксического анализа SimpleDateFormat или используйте DateTimeFormat JodaTime для создания DateTimeFormatter и анализировать объект DateTime соответственно

person Jeroen Rosenberg    schedule 15.10.2010

Если вы используете текущий java.time или threetenbp, просто проанализируйте его следующим образом:

ZonedDateTime dt = ZonedDateTime.parse(dtStart);

Теперь вы можете получить доступ к значениям даты и времени, таким как год, месяц, час и т. Д.

person pram    schedule 23.02.2020

Предположим, вы хотите рассчитать разницу во времени с учетом значений, разделенных столбцами.
finish -> 15:24:04
start -> 09:27 : 37
Я сделал следующее, не используя Date и SimpleDateFormat:

String tStart = "09:27:37";
String tFinish = "15:24:04";

String[] sTimeHourMinSec = tStart.split(":");
int sHour = Integer.valueOf(sTimeHourMinSec[0]);
int sMin = Integer.valueOf(sTimeHourMinSec[1]);
int sSec = Integer.valueOf(sTimeHourMinSec[2]);

String[] fTimeHourMinSec = tFinish.split(":");
int fHour = Integer.valueOf(fTimeHourMinSec[0]);
int fMin = Integer.valueOf(fTimeHourMinSec[1]);
int fSec = Integer.valueOf(fTimeHourMinSec[2]);

int diffTotSec = (fHour - sHour) * 3600 + (fMin - sMin) * 60 + (fSec - sSec);
int diffHours = diffTotSec / 3600;
int diffMins = (diffTotSec % 3600) / 60;
int diffSecs = (diffTotSec % 3600) % 60;

System.out.println("Difference: " + diffHours + " h " + diffMins + " m " + diffSecs + " sec");
person San Askaruly    schedule 23.05.2018
comment
Я не голосовал против. Кажется, вы отвечаете на вопрос, совершенно отличный от того, на который отправили ответ ?! К тому же это слишком сложный способ. Избегать устаревших классов, таких как Date и проблемных SimpleDateFormat, - это хорошо, но у нас есть библиотечные методы, которые не только упростят работу, но и сделают код более понятным и менее подверженным ошибкам. Взгляните на java.time, современный API даты и времени Java. - person Ole V.V.; 23.05.2018
comment
Я тоже не голосую против, но (а) ваш ответ не отвечает на вопрос, (б) настройка даты и времени почти никогда не бывает мудрым советом. Используйте для этой работы великолепно разработанные классы java.time: Instant.parse( "2010-10-15T09:27:37Z" ). См. правильный ответ Оле В.В. - person Basil Bourque; 23.05.2018
comment
Я проголосовал против, потому что он фактически не отвечает на вопрос, который я изначально задал. - person neildeadman; 23.05.2018