Как разобрать дату?[дубликат]
-
14-09-2019 - |
Вопрос
На этот вопрос уже есть ответ здесь:
- Преобразование строки Java в дату 13 ответов
Я пытаюсь проанализировать эту дату с помощью 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"
, у меня положительный ответ.В чем проблема?Как я могу разобрать этот формат?
ПС.Я получил эту дату от jDatePicker
и нет инструкций о том, как изменить формат даты, который я получаю, когда пользователь выбирает дату.
Решение
Вы не можете рассчитывать на анализ даты с помощью 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);
...
JavaДок: 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.time
А java.time framework входит в состав Java 8 и более поздних версий.Видеть Руководство.Эти новые классы вдохновлены Джода-Время, определяется ДжСР 310, и расширенный ТриДесять-Экстра проект.Они представляют собой значительное улучшение по сравнению с неприятными старыми классами java.util.Date/.Calendar и др.
Обратите внимание, что 3-4-буквенные коды, такие как EDT
не являются ни стандартизированными, ни уникальными.Избегайте их, когда это возможно.Научитесь использовать ИСО 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 );
При беге.
здт:2009-06-18T20:56:02-04:00[Америка/Нью_Йорк]
Настроить часовой пояс
Ради интереса давайте подстроимся под часовой пояс Индии.
ZonedDateTime zdtKolkata = zdt.withZoneSameInstant ( ZoneId.of ( "Asia/Kolkata" ) );
zdtКалькутта:2009-06-19T06:26:02+05:30[Азия/Калькутта]
Преобразовать в j.u.Date
Если вам действительно нужен объект java.util.Date для использования с классами, которые еще не обновлены до типов java.time, преобразуйте.Обратите внимание, что вы теряете назначенный часовой пояс, но тот же момент автоматически корректируется универсальное глобальное время.
java.util.Date date = java.util.Date.from( zdt.toInstant() );
Как насчет получить выбранную дату?В любом случае, конкретно по вашему вопросу о коде, проблема в этой строке:
new SimpleDateFormat("yyyy-MM-dd");
Строка, которая входит в конструктор, должна соответствовать формату даты.Документация о том, как это сделать, здесь.Похоже, вам нужно что-то похожее на "EEE MMM d HH:mm:ss zzz yyyy"
В ответ на:"Как преобразовать вторник, 13 сентября 2016 г., 00:00:00 GMT-0500 (Центральная Гора-де-Верано (Мексика)) в дд-ММ-гг на 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);
}