Преобразование строковой даты в строковую дату в другом формате

Я новичок в 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);
}

person Murugesapillai Nagkeeran    schedule 21.02.2013    source источник
comment
Какой результат вы получите?   -  person Apurv    schedule 21.02.2013
comment
Применить формат даты к объекту Date, а не к String strDate. Должно работать нормально   -  person Priyank Thakkar    schedule 21.02.2013


Ответы (8)


Вам нужно использовать два 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);
}
person Tim Bender    schedule 21.02.2013

Ссылки на эти форматы Java Date Format Docs :

Форматы для datetime

Попробуйте этот код:

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));
person Zaheer Ahmed    schedule 21.02.2013

Вам нужен формат для анализа текущего состояния и формат для генерации желаемого вывода.

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)));
person jlordo    schedule 21.02.2013

Попробуйте следующую служебную функцию.

// 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

person Krunal    schedule 22.06.2017

вы используете один и тот же форматировщик для обработки разных форматов.

вам необходимо предоставить два средства форматирования new SimpleDateFormat("dd-MM-yyyy"); для преобразования 2013-02-21 в объект даты и new SimpleDateFormat("dd-MM-yyyy"); для форматирования объекта даты в строку 21-02-2013.

person A4L    schedule 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. Таким образом, он анализируется как 21 февраля 2013 года нашей эры. В феврале нет 2013 дней? Нет проблем для SimpleDateFormat с настройками по умолчанию, он просто продолжает отсчет дней в следующие месяцы и годы и заканчивается 6 августа, пять с половиной лет спустя, но все еще очень рано в истории.

Если мы попробуем сделать то же самое с современными классами:

    LocalDate.parse(strDate, formatter);

- получаем java.time.format.DateTimeParseException: Text '2013-02-21' could not be parsed at index 2. Это связано с тем, что модуль форматирования указал день из двух цифр, поэтому, когда после анализа двух цифр во входной строке появляется больше цифр, это является ошибкой и сообщается как таковая. Считаю такое поведение более правильным и полезным.

person Ole V.V.    schedule 30.06.2017

Вам необходимо использовать экземпляр 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
    }
}
person Dulith De Costa    schedule 07.07.2018

person    schedule
comment
Благодарность! Я предлагаю назвать prevDateFormat и newDateFormat. - person SilverTech; 27.01.2020