Разобрать некоторую строковую дату в другой формат

У меня проблема с форматированием даты.

От : EEE, d MMM yyyy HH:mm:ss Z (пример: понедельник, 05 января 2014 г., 15:10:00 +0200)

Кому : дд/МММ/гггг ЧЧ:мм (пример: 01.05.2014 15:10)

Вот что я пробовал:

private String formatDate(String date) {
    SimpleDateFormat format = new SimpleDateFormat("dd/MMM/yyyy HH:mm");
    Date dateResult = null;
    try {
        dateResult = format.parse(date);
    }
    catch (java.text.ParseException e) {
        Log.e(TAG, "", e);
    }
    return dateResult.toString();
}

Я получаю исключение: неразборчивая дата по смещению 0

некоторая помощь была бы хороша здесь, спасибо;)


person An-droid    schedule 07.02.2014    source источник
comment
См. эту информацию обо всех форматах даты.   -  person Yugesh    schedule 07.02.2014
comment
Я уже видел это, официальный документ важен, поэтому ... но это не помогает. Моя проблема не связана с документами, а больше связана с логикой. Но спасибо   -  person An-droid    schedule 07.02.2014
comment
@Yume117 Yume117 Вы анализируете свой вход, используя формат, который вы сказали, что хотите для своего выхода. Вы допустили ошибку, предоставив здесь пример кода, или это является причиной вашей проблемы?   -  person Basil Bourque    schedule 07.02.2014
comment
Да, я так понял, я пробую посты ниже без хорошего результата на данный момент   -  person An-droid    schedule 07.02.2014


Ответы (4)


Вам нужно два раза конвертировать. Например:

private String formatDate(String date) {
    SimpleDateFormat formatFrom = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z ");

    java.util.Date tmpDate = formatFrom.parse(date);
    SimpleDateFormat formatTo = new SimpleDateFormat("dd/MMM/yyyy HH:mm");
    return formatTo.format(tmpDate);
}

Для моего собственного синтаксического анализатора RSS я использую следующий код для анализа различных форматов даты:

    if (value.contains("+")) {
        value = value.substring(0, value.lastIndexOf("+") - 1);
    }

    String[] patterns = {//"EEE, dd MMM yyyy hh:mm:ss UTC",
            "yyyy.MM.dd G 'at' HH:mm:ss z",
            "EEE, MMM d, ''yy",
            "yyyyy.MMMMM.dd GGG hh:mm aaa",
            "EEE, d MMM yyyy HH:mm:ss Z",
            "yyMMddHHmmssZ",
            "d MMM yyyy HH:mm:ss z",
            "yyyy-MM-dd'T'HH:mm:ss",
            "yyyy-MM-dd'T'HH:mm:ss'Z'",
            "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'",
            "yyyy-MM-dd'T'HH:mm:ssZ",
            "yyyy-MM-dd'T'HH:mm:ss.SSSZ",
            "yyyy-MM-dd'T'HH:mm:ssz",
            "yyyy-MM-dd'T'HH:mm:ss.SSSz",
            "EEE, d MMM yy HH:mm:ssz",
            "EEE, d MMM yy HH:mm:ss",
            "EEE, d MMM yy HH:mm z",
            "EEE, d MMM yy HH:mm Z",
            "EEE, d MMM yyyy HH:mm:ss z",
            "EEE, d MMM yyyy HH:mm:ss Z",
            "EEE, d MMM yyyy HH:mm:ss ZZZZ",
            "EEE, d MMM yyyy HH:mm z",
            "EEE, d MMM yyyy HH:mm Z",
            "d MMM yy HH:mm z",
            "d MMM yy HH:mm:ss z",
            "d MMM yyyy HH:mm z",
            "d MMM yyyy HH:mm:ss z"};

    for (int i = 0; i < patterns.length; i++) {
        SimpleDateFormat sdf = new SimpleDateFormat(patterns[i], Locale.ENGLISH);
        try {
            pubdate = sdf.parse(value);

            break;
        } catch (Exception e) {
        }
    }
person Roman Black    schedule 07.02.2014
comment
попробуй поменять д на дд - person Roman Black; 07.02.2014
comment
Только что попробовал, то же самое. Серьезно, даты - это боль, с которой нужно иметь дело :( - person An-droid; 07.02.2014
comment
Только что попробовал, то же самое. Может формат даты неверный, но я не могу понять - person An-droid; 07.02.2014
comment
Где вы берете дату? Вы знаете, какую дату в каком формате вы получаете? Я обновлю свой пост, может быть, это поможет вам. - person Roman Black; 07.02.2014
comment
я получаю это из xml-потока. Да, формат всегда один и тот же, я его зарегистрировал. Например: Пт, 12 окт 2012 06:57:39 +0200 - person An-droid; 07.02.2014
comment
Важно ли сохранять часовой пояс? - person Roman Black; 07.02.2014
comment
Я рад, что помог тебе. С наилучшими пожеланиями. - person Roman Black; 07.02.2014
comment
@RomanBlack Невозможно разобрать Sunday, 18th February, но EEEE, dd'th' MMMM не работает, в чем может быть проблема? - person Sagar; 24.10.2018

Попробуй это

SimpleDateFormat form = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z");
SimpleDateFormat postFormater = new SimpleDateFormat("dd/MMM/yyyy HH:mm");

String inputdate = "Mon, 05 Jan 2014 15:10:00 +0200";

Date date = null;

    try {
        date = form.parse(inputdate);

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

    }

String resultdate = postFormater.format(date);
person Chirag Ghori    schedule 07.02.2014

Попробуйте код ниже:

String parseStringDate(String sqlDate) {
    String strDate = "";
    java.util.Date utilDate;

    SimpleDateFormat sqlDateFormat = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z");
    try {
        Calendar calTempDate = Calendar.getInstance();
        utilDate = sqlDateFormat.parse(sqlDate);

        calTempDate.setTime(utilDate);
        strDate = new SimpleDateFormat("dd/MMM/yyyy HH:mm").format(calTempDate.getTime());
    } catch (Exception e) {
        e.printStackTrace();
    }
    return strDate;
}
person The Heist    schedule 07.02.2014

Неправильные данные образца

Данные вашего примера Mon, 05 Jan 2014 15:10:00 +0200 неверны. Дата была воскресенье, а не понедельник.

Java.время

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

Ваш ввод имеет формат, соответствующий RFC 1123. Классы java.time включают форматировщик для этого конкретного формата.

String input = "Sun, 05 Jan 2014 15:10:00 +0200";
DateTimeFormatter f = DateTimeFormatter.RFC_1123_DATE_TIME ;
OffsetDateTime odt = OffsetDateTime.parse( input , f );

odt.toString(): 2014-01-05T15:10+02:00

См. действующий код на IdeOne.com.

Что касается генерации строки в других форматах, это уже много раз обсуждалось в Stack Overflow. Найдите DateTimeFormatter класс.


О java.time

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

Проект Joda-Time, теперь в режим обслуживания, советует перейти на java.time.

Чтобы узнать больше, см. Учебное пособие по Oracle. И поищите множество примеров и пояснений в Stack Overflow. Спецификация: JSR 310.

С драйвером JDBC, соответствующим JDBC 4.2 или более поздней версии вы можете обмениваться объектами java.time непосредственно с вашей базой данных. Нет необходимости в строках или классах java.sql.*.

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

  • Java SE 8, Java SE 9, and later
    • Built-in.
    • Часть стандартного Java API со встроенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 and Java SE 7
    • Much of the java.time functionality is back-ported to Java 6 & 7 in ThreeTen-Backport.
  • Android
person Basil Bourque    schedule 11.12.2016
comment
Не удалось разобрать воскресенье, 18 февраля, когда EEEE, dd'th' MMMM не работает? - person Sagar; 24.10.2018
comment
@SagarHudge Опубликуйте свой собственный вопрос с подробностями и с MCVE. - person Basil Bourque; 24.10.2018
comment
@SagarHudge (а) Укажите Locale. (b) Вам нужен год для этого ввода. Вы не можете определить день недели без года. В противном случае для месяца и дня без указания года и времени суток или часового пояса используйте класс YearMonth. LocalDate.parse( "Sunday, 18th February 2018" , DateTimeFormatter.ofPattern( "EEEE, dd'th' MMMM uuuu" , Locale.US ) ) - person Basil Bourque; 24.10.2018