Как разобрать дату?
Я пытаюсь разобрать эту дату с 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 ответов
Вы не можете ожидать разбора даты с SimpleDateFormat, который настроен в другом формате.
Для разбора вашей строки даты "Чт 18 июня 20:56:02 EDT 2009" вам нужен SimpleDateFormat, например (примерно):
SimpleDateFormat parser=new SimpleDateFormat("EEE MMM d HH:mm:ss zzz yyyy");
Используйте это, чтобы проанализировать строку в Date, а затем ваш другой SimpleDateFormat, чтобы превратить эту Date в нужный вам формат.
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
Проблема в том, что ваша дата отформатирована так:
Thu Jun 18 20:56:02 EDT 2009
Но используете SimpleDateFormat
то есть:
yyyy-MM-dd
Два формата не согласны. Вам нужно построить SimpleDateFormat
это соответствует расположению строки, которую вы пытаетесь проанализировать в Date. Выстроить вещи, чтобы было легко увидеть, вы хотите SimpleDateFormat
как это:
EEE MMM dd HH:mm:ss zzz yyyy
Thu Jun 18 20:56:02 EDT 2009
Проверьте страницу JavaDoc, на которую я ссылался, и посмотрите, как используются символы.
Теперь у нас есть более современный способ сделать эту работу.
java.time
Инфраструктура java.time поставляется с Java 8 и более поздними версиями. Смотрите учебник. Эти новые классы основаны на Joda-Time, определенной JSR 310 и расширенной проектом ThreeTen-Extra. Они представляют собой значительное улучшение по сравнению с проблемными старыми классами, java.util.Date/.Calendar et al.
Обратите внимание, что 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 [Америка / Нью-Йорк]
Отрегулируйте часовой пояс
Для развлечения давайте настроимся на часовой пояс Индии.
ZonedDateTime zdtKolkata = zdt.withZoneSameInstant ( ZoneId.of ( "Asia/Kolkata" ) );
zdtKolkata: 2009-06-19T06: 26: 02 + 05: 30 [Азия / Калькутта]
Конвертировать в juDate
Если вам действительно нужен объект java.util.Date для использования с классами, еще не обновленными до типов java.time, выполните преобразование. Обратите внимание, что вы теряете назначенный часовой пояс, но тот же момент автоматически настраивается на 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 (Центральная провинция (Мексика)) в 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);
}