web-dev-qa-db-ja.com

文字列の日付を文字列の日付の異なる形式に変換する

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);
}
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));
32
asifsid88

2つのDateFormatインスタンスを使用する必要があります。 1つは入力文字列のフォーマットを含み、もう1つは出力文字列に必要なフォーマットを含みます。

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);
}
9
Tim Bender

これらの形式を参照 Java Date Format Docs

Formats for 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));
3
Zaheer Ahmed

現在の状態を解析するためのフォーマットと、必要な出力を生成するためのフォーマットが必要です。

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)));
2
jlordo

次のユーティリティ関数を試してください。

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

結果: 2017年2月6日

1
Krunal

同じフォーマッターを使用して異なるフォーマットを処理している。

_2013-02-21_を日付オブジェクトに変換するための2つのフォーマッターnew SimpleDateFormat("dd-MM-yyyy");と、日付オブジェクトを文字列_21-02-2013_にフォーマットするためのnew SimpleDateFormat("dd-MM-yyyy");を提供する必要があります。

0
A4L

まず、Postgresデータベースから日付をStringとして取得しないでください。日付を表す型のオブジェクトとして取得する必要があります。

第2に、2013年にはDateSimpleDateFormatの使用は当たり前で合理的でしたが、日が過ぎ、新しくてより良い日付と時刻のクラスが登場し、一般的に使用されるようになりました。私見誰ももう古いクラスを使うべきではありません、そして私はそれらを長い間古くしていると思います。

データベースから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-21new文字列dd-MM-yyyyに対して意図したフォーマッタで解析していたことです。したがって、2013年2月21日のADとして解析されます。 2013年2月はありませんか?デフォルトの設定でSimpleDateFormatを使用しても問題ありません。次の月と年までの日数を数え続けるだけで、5年半後の8月6日まで続きますが、それでも歴史の非常に早い段階です。

現代のクラスで同様にやってみると:

    LocalDate.parse(strDate, formatter);

Java.time.format.DateTimeParseException: Text '2013-02-21' could not be parsed at index 2を取得します。これは、フォーマッターが2桁の日を示したため、2桁を解析した後、入力文字列にさらに桁があると、エラーとなり、そのように報告されます。私は、この動作がより正確で役立つと考えています。

0
Ole V.V.

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
    }
}
0
Dulith De Costa