Невозможно преобразовать дату String в дату - ошибка даты, не поддающаяся анализу

У меня есть строка даты в следующем формате, например:

Thu, 17 Mar 2016 19:30:25 +0000
Sun, 06 Mar 2016 12:43:13 +0000

Я хочу преобразовать эту дату в более читаемый формат:

Thu, 17 Mar 2016
Sun, 06 Mar 2016


public static String getMoreReadableDateFormat(String dateStringToConvert) {
    SimpleDateFormat dateFormat = new SimpleDateFormat("E, dd MMM yyyy HH:mm:ss Z");
    Date convertedDate;
    try {
        convertedDate = dateFormat.parse(dateStringToConvert);
    } catch (ParseException e) {
        // could not convert date, return the initial form
        return dateStringToConvert;
    }
    String formattedDate = new SimpleDateFormat("E, dd MMM yyyy").format(convertedDate);
    return formattedDate;
}

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


person Paul    schedule 17.03.2016    source источник
comment
Убедитесь, что dateStringToConvert имеет правильный формат: E, dd MMM yyyy HH:mm:ss Z   -  person Shadab Ansari    schedule 17.03.2016


Ответы (2)


Вы можете попробовать установить формат даты вашего телефона на французский или что-то еще, чтобы воспроизвести поведение, о котором вы упомянули.

Вы уверены, что параметр dateStringToConvert всегда имеет правильный формат?

Я бы посоветовал вам изменить первую строку на:

SimpleDateFormat dateFormat = new SimpleDateFormat("E, dd MMM yyyy HH:mm:ss Z", Locale.ENGLISH);
person Michel    schedule 17.03.2016
comment
dateStringToConvert всегда в правильном формате. Кажется, что если я использую Locale.ENGLISH, это работает, но я не уверен, что правильно использовать английский все время. Если я использую этот Locale: Locale current = getResources().getConfiguration().locale; - это также не работает в некоторых странах. - person Paul; 17.03.2016

Здесь важно отметить разницу между форматами даты, такими как дата, время и дата и время, как указано в ссылке ниже. Учитывая ваш блок кода, похоже, вы ожидаете, что строка даты и времени будет передана, и вы ожидаете вернуть только дату. Я предполагаю, что он не соответствует формату, который вы объявляете как

new SimpleDateFormat("E, dd MMM yyyy HH:mm:ss Z")

Кроме того, похоже, что эта строка не соответствует предопределенным форматам. Вы можете попробовать переформатировать его, чтобы использовать

DateFormat dateAndTimeFormatter = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, currentLocale);

Это примет строку вроде

"Tuesday, June 30, 2009 7:03:47 AM PDT"

проанализируйте параметр с помощью средства форматирования выше, а затем преобразуйте другой dateFormatter

DateFormat dateFormatter = DateFormat.getDateInstance(DateFormat.DEFAULT, currentLocale);

вы можете получить локальный по умолчанию из

Locale.getDefault()

Итак, ваш код будет выглядеть примерно так

public static String convertDate(String dateStringToConvert) throws ParseException {
        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, Locale.getDefault());
        Date convertedDate = dateFormat.parse(dateStringToConvert);
        return DateFormat.getDateInstance(DateFormat.DEFAULT, Locale.getDefault()).format(convertedDate);
    }

Проверьте здесь для получения дополнительной информации, связанной с использованием предопределенных форматов. https://docs.oracle.com/javase/tutorial/i18n/format/dateFormat.html

person jcarey    schedule 17.03.2016
comment
Locale.getDefault() работает не во всех странах. Я использовал несколько форматов: E, dd MMM yyyy HH:mm:ss Z и EEE, d MMM yyyy HH:mm:ss Z - но оба дали одинаковый результат: у меня сработало, но не в некоторых других странах. Ваш метод мне тоже не подходит.. - person Paul; 18.03.2016
comment
Вы уверены, что ваш часовой пояс установлен правильно? +0000 должно быть чем-то вроде EST, и это может вызвать исключение при синтаксическом анализе. - person jcarey; 18.03.2016