Преобразовать строковую дату в строковую дату в другом формате
Я новичок в Java. Postgres db содержат формат даты yyyy-MM-dd
, Мне нужно конвертировать в dd-MM-yyyy
,
Я пробовал это, но неправильный результат - отображение
public static void main(String[] args) throws ParseException {
String strDate = "2013-02-21";
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
Date da = (Date)formatter.parse(strDate);
System.out.println("==Date is ==" + da);
String strDateTime = formatter.format(da);
System.out.println("==String date is : " + strDateTime);
}
8 ответов
SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat format2 = new SimpleDateFormat("dd-MM-yyyy");
Date date = format1.parse("2013-02-21");
System.out.println(format2.format(date));
Вам нужно использовать два DateFormat
экземпляров. Тот, который содержит формат входной строки, и второй, который содержит желаемый формат для выходной строки.
public static void main(String[] args) throws ParseException {
String strDate = "2013-02-21";
DateFormat inputFormatter = new SimpleDateFormat("yyyy-MM-dd");
Date da = (Date)inputFormatter.parse(strDate);
System.out.println("==Date is ==" + da);
DateFormat outputFormatter = new SimpleDateFormat("dd-MM-yyyy");
String strDateTime = outputFormatter.format(da);
System.out.println("==String date is : " + strDateTime);
}
Ссылка на эти форматы Документы формата Java даты:
Попробуйте этот код:
String myDate= "2013-02-21";
DateFormat iFormatter = new SimpleDateFormat("yyyy-MM-dd");
DateFormat oFormatter = new SimpleDateFormat("dd-MM-yyyy");
String strDateTime = oFormatter.format(iFormatter.parse(myDate));
Вам нужен формат для анализа текущего состояния и формат для генерации желаемого результата.
String strDate = "2013-02-21";
DateFormat to = new SimpleDateFormat("dd-MM-yyyy"); // wanted format
DateFormat from = new SimpleDateFormat("yyyy-MM-dd"); // current format
System.out.println(to.format(from.parse(strDate)));
Попробуйте следующую служебную функцию.
// convert String date to another string date
public String convertStringDateToAnotherStringDate(String stringdate, String stringdateformat, String returndateformat){
try {
Date date = new SimpleDateFormat(stringdateformat).parse(stringdate);
String returndate = new SimpleDateFormat(returndateformat).format(date);
return returndate;
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return "";
}
}
// call function with required parameter arguments
String resultDate = convertStringDateToAnotherStringDate("2017-06-22", "yyyy-MM-dd", "dd-MM-yyyy")
System.out.println(resultDate);
Результат: 22-06-2017
Вы используете один и тот же форматер для обработки разных форматов.
вам нужно предоставить два форматера new SimpleDateFormat("dd-MM-yyyy");
для конвертации 2013-02-21
на сегодняшний день объект и new SimpleDateFormat("dd-MM-yyyy");
для форматирования объекта даты в строку 21-02-2013
,
Во-первых, вы не должны получать дату как String
из вашей базы данных Postgres. Вы должны получить его как объект типа, представляющего дату.
Во-вторых, в то время как в 2013 году использование Date
а также SimpleDateFormat
были обычным и разумным, прошли дни, и появились новые и лучшие классы даты и времени, которые стали широко использоваться. ИМХО, никто не должен больше использовать старые классы, и я считаю их давно устаревшими.
Чтобы получить LocalDate
объект из вашего ResultSet
из вашей базы данных:
LocalDate da = yourResultSet.getObject(3, LocalDate.class);
(Я предполагаю, что дата в столбце 3 в запросе).
Чтобы отформатировать его в dd-MM-yyyy
:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-uuuu");
String strDateTime = da.format(formatter);
System.out.println("==String date is : " + strDateTime);
Это дало бы вывод как
==String date is : 21-02-2013
Наконец, если у вас есть строка, как в вопросе, и вы хотите переформатировать ее в желаемый формат:
String strDate = "2013-02-21";
LocalDate da = LocalDate.parse(strDate);
System.out.println("==Date is ==" + da);
Это печатает
==Date is ==2013-02-21
Я использую тот факт, что строка соответствует стандартному формату даты ISO 8601, который используется по умолчанию для современных классов даты и времени. Таким образом, в этом случае нам не нужен явный форматер для синтаксического анализа, как для анализа других форматов.
Форматирование в нужный формат происходит точно так же, как и раньше.
Пример беды со старыми классами
На моем компьютере вывод из кода в вопросе
==Date is ==Tue Aug 06 00:00:00 CET 26
==String date is : 06-08-0026
Вы явно получаете неправильный результат, и вы не понимаете, что было неправильно. Что было не так, так это то, что вы разбирали свою строку даты в БД, 2013-02-21
с форматером, который вы предназначали для новой строки, dd-MM-yyyy
, Таким образом, он анализируется как 2013-го февраля 21 года нашей эры. В феврале нет дней 2013? Нет проблем для SimpleDateFormat
с настройками по умолчанию он просто продолжает считать дни в следующие месяцы и годы и заканчивается 6 августа пятью с половиной годами позже, но все еще очень рано в истории.
Если мы попытаемся сделать то же самое с современными классами:
LocalDate.parse(strDate, formatter);
- мы получаем java.time.format.DateTimeParseException: Text '2013-02-21' could not be parsed at index 2
, Это связано с тем, что средство форматирования указало двухзначный день, поэтому, когда после разбора двух цифр во входной строке появляется больше цифр, это ошибка, и она сообщается как таковая. Я считаю это поведение более правильным и полезным.
Вам нужно использовать SimpleDateFormat
экземпляр и передать шаблон даты, который вы предпочитаете.
Текущая модель: yyyy-MM-dd
Шаблон, который необходим: dd-MM-yyyy
Теперь попробуйте следующее. Создает требуемый шаблон формата даты.
public class App {
public static void main(String[] args) {
SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat format2 = new SimpleDateFormat("dd-MM-yyyy");
Date date = null;
try {
date = format1.parse("2013-02-21");
System.out.println(format1.format(date)); //current format: 2013-02-21
} catch (ParseException e) {
e.printStackTrace();
}
System.out.println(format2.format(date)); //the format that is needed : 21-02-2013
}
}