Как разобрать дату? [дубликат]


этот вопрос уже есть ответ здесь:

Я пытаюсь разобрать эту дату с 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 и там нет инструкции о том, как изменить формат даты я получаю, когда пользователь выбирает дату.

5 159

5 ответов:

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

чтобы разобрать вашу строку даты" Чт июня 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);

        ...

документация: http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

проблема в том, что у вас есть дата в формате такой:

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, на которую я ссылался, и посмотрите, как используются символы.

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

java.время

The java.время платформа поставляется с Java 8 и более поздними версиями. Смотрите учебник. Эти новые классы вдохновлены Joda Времени, определено JSR 310 и продлен ThreeTen-Extra. Они являются огромным улучшением по сравнению с неприятными старыми классами, java.утиль.Дата./Календарь и др.

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

Кстати, обратите внимание, как Java.время по умолчанию генерирует строки с использованием форматов 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 );

Dump to приставка.

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.утиль.Объект Date для использования с классами, которые еще не обновлены до java.времени , конвертировать. Обратите внимание, что вы теряете назначенный часовой пояс, но тот же момент автоматически настраивается на UTC.

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

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

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

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

В ответ на: "как конвертировать Вт 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);
}