Вопрос-ответ

How to parse a date? [duplicate]

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

Я пытаюсь разобрать эту дату с помощью 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. Я получил эту дату из a 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 и более поздними версиями. Смотрите Руководство. Эти новые классы основаны на 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[Америка/New_York]


Настройка часового пояса

Для развлечения давайте приспособимся к часовому поясу Индии.

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

здтКолката : 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 гггг"

2023-11-20 14:53 java date