Как разбирать дату?

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

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Formaterclass {
    public static void main(String[] args) throws ParseException{
        String strDate = "Thu Jun 18 20:56:02 EDT 2009";
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        Date dateStr = formatter.parse(strDate);
        String formattedDate = formatter.format(dateStr);
        System.out.println("yyyy-MM-dd date is ==>"+formattedDate);
        Date date1 = formatter.parse(formattedDate);

        formatter = new SimpleDateFormat("dd-MMM-yyyy");
        formattedDate = formatter.format(date1);
        System.out.println("dd-MMM-yyyy date is ==>"+formattedDate);
    }
}

Если я попробую этот код с помощью strDate = "2008-10-14", у меня есть положительный ответ. В чем проблема? Как я могу разобрать этот формат?

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

Ответ 1

Вы не можете ожидать синтаксического анализа даты с помощью SimpleDateFormat, который настроен в другом формате.

Чтобы проанализировать строку даты "Thu Jun 18 20:56:02 EDT 2009", вам нужно SimpleDateFormat, как это (примерно):

SimpleDateFormat parser=new SimpleDateFormat("EEE MMM d HH:mm:ss zzz yyyy");

Используйте это, чтобы проанализировать строку в Дате, а затем ваш другой SimpleDateFormat, чтобы превратить эту дату в желаемый формат.

        String input = "Thu Jun 18 20:56:02 EDT 2009";
        SimpleDateFormat parser = new SimpleDateFormat("EEE MMM d HH:mm:ss zzz yyyy");
        Date date = parser.parse(input);
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        String formattedDate = formatter.format(date);

        ...

JavaDoc: http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

Ответ 2

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

Thu Jun 18 20:56:02 EDT 2009

Но используют SimpleDateFormat, который:

yyyy-MM-dd

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

EEE MMM dd HH:mm:ss zzz yyyy
Thu Jun 18 20:56:02 EDT 2009

Проверьте страницу JavaDoc, с которой я связан, и посмотрите, как используются символы.

Ответ 3

Теперь у нас есть более современный способ сделать эту работу.

java.time

Структура java.time связана с Java 8 и более поздними версиями. См. Tutorial. Эти новые классы вдохновлены Joda-Time, определенными JSR 310, и расширены ThreeTen-Extra. Это огромное улучшение по сравнению с трудными старыми классами, java.util.Date/.Calendar и др.

Обратите внимание, что 3-4 буквенных кода, таких как EDT, не являются стандартизованными и не уникальными. Избегайте их, когда это возможно. Научитесь использовать стандартные форматы ISO 8601. Рамка java.time может занять при переводе, но многие из обычно используемых кодов имеют повторяющиеся значения.

Кстати, обратите внимание, как java.time по умолчанию генерирует строки с использованием форматов ISO 8601, но расширяется добавлением имени часового пояса в скобках.

String input = "Thu Jun 18 20:56:02 EDT 2009";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "EEE MMM d HH:mm:ss zzz yyyy" , Locale.ENGLISH );
ZonedDateTime zdt = formatter.parse ( input , ZonedDateTime :: from );

Дамп для консоли.

System.out.println ( "zdt : " + zdt );

При запуске.

zdt: 2009-06-18T20: 56: 02-04: 00 [America/New_York]

Отрегулировать часовой пояс

Для удовольствия отрегулируйте часовой пояс в Индии.

ZonedDateTime zdtKolkata = zdt.withZoneSameInstant ( ZoneId.of ( "Asia/Kolkata" ) );

zdtKolkata: 2009-06-19T06: 26: 02 + 05: 30 [Азия/Калькутта]

Преобразовать в j.u.Date

Если вам действительно нужен объект java.util.Date для использования с классами, еще не обновленными для типов java.time, конвертируйте. Обратите внимание, что вы теряете назначенный часовой пояс, но тот же момент автоматически настраивается на UTC.

java.util.Date date = java.util.Date.from( zdt.toInstant() );

Ответ 4

Как насчет getSelectedDate? В любом случае, особенно в вопросе вашего кода, проблема связана с этой строкой:

new SimpleDateFormat("yyyy-MM-dd");

Строка, которая идет в конструкторе, должна соответствовать формату даты. Документация о том, как это сделать, здесь. Похоже, вам нужно что-то близкое к "EEE MMM d HH: mm: ss zzz yyyy"

Ответ 5

В ответ на: " Как конвертировать Tue Sep 13 2016 00:00:00 GMT-0500 (Hora de verano central (México)) в dd-MM-yy в Java?", было отмечено, как дублировать

Попробуйте следующее: С java.util.Date, java.text.SimpleDateFormat это простое решение.

public static void main(String[] args) throws ParseException {

    String fecha = "Tue Sep 13 2016 00:00:00 GMT-0500 (Hora de verano central (México))";
    Date f = new Date(fecha);

    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    sdf.setTimeZone(TimeZone.getTimeZone("-5GMT"));
    fecha = sdf.format(f);
    System.out.println(fecha);
}