Java ParseException при попытке разбора строки на дату - PullRequest
3 голосов
/ 06 октября 2011

Мне трудно разобрать / отформатировать строку даты, полученную от веб-службы. Я пробовал несколько подходов, но безуспешно.

Строка даты выборки:

2011-10-05T03:00:00Z

Исключение:

W/System.err(10072): java.text.ParseException: Unparseable date: "2011-10-05T05:00:00Z" (at offset 10)
W/System.err(10072):    at java.text.DateFormat.parse(DateFormat.java:626)

Пример кода:

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:SSSS");
Date date = formatter.parse(info.AiringTime);

Я обнаружил, что если я уберу букву «Т» между датой и временем и заменим ее пробелом, она будет отлично отформатирована. У кого-нибудь есть предложения?

- ОБНОВЛЕНИЕ -

После более глубокого изучения документации по API я нашел следующее:

Все значения DateTime ответа представлены в формате UTC. Вам необходимо применить смещение UTC для расчета местного времени для отображения.

DateTime - это значение даты и времени, указанное в одном из следующих форматов:

Формат UTC: ГГГГ-ММ-ДДЧч: мм: ссЗ. Например: 2011-03-15T02: 00: 00Z.

Местное время со смещением: ГГГГ-ММ-ДДЧч: мм: сс + или - чч: мм (положительное или отрицательное смещение). Например, для тихоокеанского времени США: 2011-03-14T06: 00: 00 -08: 00.

Есть предложения по подходу в формате UTC?

Ответы [ 5 ]

11 голосов
/ 06 октября 2011

Вы можете попробовать:

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
String dateString = dateString.replace("Z", "GMT+00:00");
Date date = dateFormat.parse(dateString);

Приведенный выше код должен корректно обрабатывать случай, когда в дате указан часовой пояс. Поскольку Z представляет часовой пояс UTC / GMT, он заменяется на GMT, поэтому SimpleDateFormat может правильно его интерпретировать (я хотел бы знать более чистый способ обработки этого бита, если кто-нибудь его знает).

2 голосов
/ 06 октября 2011

Попробуйте,

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
1 голос
/ 06 октября 2011

Этот шаблон должен анализировать указанную вами дату: "yyyy-MM-dd'T'HH:mm:ss'Z'".
Если вы хотите использовать SimpleDateFormat и у вас ограниченное количество вариантов, вы можете создать отдельные средства форматирования для каждого шаблона и объединить их в цепочку:

Date date = formatter1.parse(info.AiringTime);
if (date == null)
{
  date = formatter2.parse(info.AiringTime);
  if (date == null)
  {
    date = formatter2.parse(info.AiringTime);
    if (date == null)
    {
      date = formatter3.parse(info.AiringTime);
    }
  }
}

или поместите их в список и выполняйте итерацию до тех пор, пока значение не станет равным NULL или больше не будет.
Если у вас слишком много шаблонов для практического использования, вы можете проанализировать их самостоятельно или попробовать одну из этих библиотек .

0 голосов
/ 24 ноября 2017
SimpleDateFormat isoDateFormat = new SimpleDateFormat("yyyy-mm-dd'T'hh:mm:ss'Z'");
SimpleDateFormat viewFriendlyDateFormat = new SimpleDateFormat("dd/MMM/yyyy hh:mm:ss aaa");
String viewFriendlyDate = "";
try { 
    Date date = isoDateFormat.parse(timestamp);
    viewFriendlyDate = viewFriendlyDateFormat.format(date);

} catch (ParseException e) { 
    e.printStackTrace(); 
} 
0 голосов
/ 24 ноября 2017

Это сработало для меня

    SimpleDateFormat isoDateFormat = new SimpleDateFormat("yyyy-mm-dd'T'hh:mm:ss'Z'");
    SimpleDateFormat viewFriendlyDateFormat = new SimpleDateFormat("dd/MMM/yyyy hh:mm:ss aaa");
    String viewFriendlyDate = "";
    try {
        Date date = isoDateFormat.parse(timestamp);
        viewFriendlyDate = viewFriendlyDateFormat.format(date);

    } catch (ParseException e) {
        e.printStackTrace();
    }
...