Java: исключение непарсируемой даты - PullRequest
24 голосов
/ 06 января 2010

При попытке преобразовать формат даты я получаю исключение: неразборчивая дата и не знаю, как решить эту проблему.

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

Я пытался сделать следующее:

private String modifyDateLayout(String inputDate){
        try {
            //inputDate = "2010-01-04 01:32:27 UTC";
            Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z").parse(inputDate);
            return new SimpleDateFormat("dd.MM.yyyy HH:mm:ss").format(date);
        } catch (ParseException e) {
            e.printStackTrace();
            return "15.01.2010";
        }
    }

В любом случае линия

String modifiedDateString = originalDate.toString();

пустышка. Я хотел бы получить строку даты в следующем формате:

дд.мм.гггг ЧЧ: мм: сс

и пример входной строки следующий:

2010-01-04 01:32:27 UTC

Кто-нибудь знает, как преобразовать приведенную выше примерную дату (String) в строковый формат дд.мм.гггг ЧЧ: мм: сс?

Спасибо!

Редактировать: я исправил неправильный формат даты ввода, но все равно он не работает. Выше - вставленный метод, а ниже - изображение экрана из сеанса отладки.

альтернативный текст http://img683.imageshack.us/img683/193/dateproblem.png

# * Обновление 1033 * Я побежал

String[] timezones = TimeZone.getAvailableIDs();

и в массиве есть строка UTC. Это странная проблема.

Я сделал грязный хак, который работает:

private String modifyDateLayout(String inputDate){
    try {
        inputDate = inputDate.replace(" UTC", "");
        Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(inputDate);
        return new SimpleDateFormat("dd.MM.yyyy HH:mm:ss").format(date);
    } catch (ParseException e) {
        e.printStackTrace();
        return "15.01.2010";
    }
}

Но все же я бы предпочел преобразовать исходный ввод без удаления часового пояса.

Этот код написан для телефона Android с использованием JDK 1.6.

Ответы [ 2 ]

48 голосов
/ 06 января 2010

То, что вы в основном делаете здесь, полагается на Date#toString(), который уже имеет фиксированный паттерн. Чтобы преобразовать объект Java Date в другой читаемый человеком шаблон String, вам потребуется SimpleDateFormat#format().

private String modifyDateLayout(String inputDate) throws ParseException{
    Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z").parse(inputDate);
    return new SimpleDateFormat("dd.MM.yyyy HH:mm:ss").format(date);
}

Кстати, исключение «непарсируемая дата» может здесь только быть выброшено SimpleDateFormat#parse(). Это означает, что inputDate не соответствует ожидаемой схеме "yyyy-MM-dd HH:mm:ss z". Возможно, вам потребуется изменить шаблон, чтобы он соответствовал фактическому шаблону inputDate.

Обновление: Хорошо, я сделал тест:

public static void main(String[] args) throws Exception {
    String inputDate = "2010-01-04 01:32:27 UTC";
    String newDate = new Test().modifyDateLayout(inputDate);
    System.out.println(newDate);
}

Это правильно печатает:

03.01.2010 21:32:27

(я в GMT-4)

Обновление 2: согласно вашим изменениям, вы действительно получили ParseException на это. Наиболее подозрительной частью будет часовой пояс UTC. Это действительно известно в вашей среде Java? Какую версию Java и какую версию ОС вы используете? Проверьте TimeZone.getAvailableIDs(). Между ними должно быть UTC.

0 голосов
/ 13 марта 2019

Я столкнулся с этой ошибкой, работая в Talend. Я смог без проблем хранить S3 CSV-файлы, созданные из Redshift. Ошибка произошла, когда я пытался загрузить те же файлы CSV S3 в базу данных MySQL Amazon RDS. Я пробовал стандартные временные метки Talend, но они выдавали исключение: непарсируемая дата при загрузке в MySQL.

Это из принятого ответа помогло мне решить эту проблему:

Кстати, исключение «непарсируемая дата» здесь может быть вызвано только SimpleDateFormat # parse (). Это означает, что inputDate не соответствует ожидаемому шаблону «гггг-мм-дд чч: мм: сс z». Возможно, вам потребуется изменить шаблон, чтобы он соответствовал фактическому шаблону inputDate

Ключом к моему решению было изменение схемы Talend. Talend установил для поля метки времени значение «date», поэтому я изменил его на «timestamp», а затем вставил «yyyy-MM-dd HH: mm: ss z» в столбец строки формата.

У меня были другие проблемы с 12-часовым и 24-часовым переводом отметок времени, пока я не добавил «z» в конце строки отметки времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...