2015-02-03 21 views
2

Я пытаюсь изменить формат даты из ответа JSON, но продолжаю получать java.text.ParseException.Формат даты в формате Java

Это дата с сервера 2015-02-03T08:37:38.000Z и хочу показать, что это 2015/02/03 Это yyyy-MM-dd. И я сделал это.

DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); 
SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd"); 
String dateResp = transactionItem.get(position).getDate(); 
try { 
    Date date = df1.parse(dateResp); 
    transDate.setText(dateFormatter.format(date)); 
} catch (ParseException e) { 
    e.printStackTrace(); 
} 

Но исключение продолжает демонстрироваться.

+0

Какая датаРас вы получаете? –

ответ

11

Вы должны избежать Z: Try

"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" 

использовать это для форматирования цели вместо вашего условии форматирования строки. Он должен работать хорошо :)

+0

Хотя вы можете избежать этого подхода, он представляет собой плохую привычку, и поэтому я рекомендую против нее. Избегая «Z», вы игнорируете важную информацию: смещение-от-UTC или часовой пояс. 'Z' является коротким для' Zulu' и означает [UTC] (https://en.wikipedia.org/wiki/Coordinated_Universal_Time). –

0

ТЛ; др

Instant.parse("2015-02-03T08:37:38.000Z") 
     .atZone(ZoneId.of("America/Montreal")) 
     .toLocalDate() 
     .toString() // 2015-02-03 

Использование java.time

Современный способ справиться с дата-время работы является с классами java.time.

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

Разберите эту строку как Instant. Класс Instant представляет собой момент на временной шкале в UTC с разрешением nanoseconds (до девяти (9) цифр десятичной дроби).

Instant instant = Instant.parse("2015-02-03T08:37:38.000Z") ; 

Для извлечения даты необходимо указать часовой пояс. В любой момент времени по всему миру меняется зона. Например, через мгновение после полуночи в Париже Франция - новый день, еще «вчера» в Монреале, Канада.

ZoneId z = ZoneId.of("America/Montreal"); 
ZonedDateTime zdt = instant.atZone(z); 

Вы хотите только часть даты без времени суток. Поэтому извлеките LocalDate. В то время как в LocalDate отсутствует какая-либо концепция смещения-от-UTC или часового пояса, метод toLocalDate относится к часовому поясу объекта ZonedDateTime при определении даты.

LocalDate ld = zdt.toLocalDate(); 

Вы, кажется, хотите стандарт ISO 8601, YYYY-MM-DD. Просто позвоните toString, не указывая шаблон форматирования.

String output = ld.toString(); 

2015-02-03


О java.time

java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытесняют неприятные старые legacy классы времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Проект Joda-Time, в настоящее время в maintenance mode, советует перейти на классы java.time.

Чтобы узнать больше, см. Oracle Tutorial. И поиск Stack Overflow для многих примеров и объяснений. Спецификация: JSR 310.

Где получить классы java.time?

  • Java SE 8 и SE 9, а затем
    • Встроенный.
    • Часть стандартного Java API с объединенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и SE 7
    • Большая часть функциональности java.time будет обратно портирован на Java 6 & 7 в ThreeTen-Backport.
  • Android

Проект ThreeTen-Extra расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval, YearWeek, YearQuarter и more.