Преобразовать строковую дату в строковую дату в другом формате

Я новичок в 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
    }
}
Другие вопросы по тегам