Проблема в том, что у вас дата отформатирована следующим образом:
Thu Jun 1820:56:02 EDT 2009
Но вы используете SimpleDateFormat то есть:
yyyy-MM-dd
Два формата не согласуются. Вам нужно создать SimpleDateFormat который соответствует расположению строки, которую вы пытаетесь разобрать в дату. Выстраивая все так, чтобы было легко видеть, вы хотите SimpleDateFormat вот так:
Проверьте страницу 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, но расширенные добавлением названия часового пояса в скобках.
Stringinput="Thu Jun 18 20:56:02 EDT 2009"; DateTimeFormatterformatter= DateTimeFormatter.ofPattern ( "EEE MMM d HH:mm:ss zzz yyyy" , Locale.ENGLISH ); ZonedDateTimezdt= formatter.parse ( input , ZonedDateTime :: from );
Дамп на консоль.
System.out.println ( "zdt : " + zdt );
При запуске.
zdt: 2009-06-18T20:56:02-04:00[Америка/New_York]
Настройка часового пояса
Для развлечения давайте приспособимся к часовому поясу Индии.
Если вам действительно нужен объект java.util.Date для использования с классами, которые еще не обновлены до типов java.time, преобразуйте. Обратите внимание, что вы теряете назначенный часовой пояс, но тот же момент времени автоматически корректируется на UTC.
Как насчет getSelectedDate? В любом случае, конкретно по вашему вопросу о коде, проблема в этой строке:
newSimpleDateFormat("yyyy-MM-dd");
Строка, которая вводится в конструктор, должна соответствовать формату даты. Документация о том, как это сделать, находится здесь. Похоже, вам нужно что-то близкое к "EEE MMM d HH: mm: ss zzz гггг"