web-dev-qa-db-ja.com

java.util.Dateのフォーマット変換yyyy-mm-ddからmm-dd-yyyyへ

Java.util.Dateという形式のyyyy-mm-ddがあります。 mm-dd-yyyyの形式にしたい

以下は、この変換のために試したutilのサンプルです。

// Setting the pattern
    SimpleDateFormat sm = new SimpleDateFormat("mm-dd-yyyy");
    // myDate is the Java.util.Date in yyyy-mm-dd format
    // Converting it into String using formatter
    String strDate = sm.format(myDate);
    //Converting the String back to Java.util.Date
    Date dt = sm.parse(strDate);

それでも私が得ている出力はmm-dd-yyyyのフォーマットではありません。

Java.util.Dateyyyy-mm-ddからmm-dd-yyyyにフォーマットする方法を教えてください

59
user182944

Dateは、UNIXエポック(1970年1月1日、00:00:00 UTC)から経過したミリ秒数のコンテナです。

フォーマットの概念はありません。

Java 8以降

LocalDateTime ldt = LocalDateTime.now();
System.out.println(DateTimeFormatter.ofPattern("MM-dd-yyyy", Locale.ENGLISH).format(ldt));
System.out.println(DateTimeFormatter.ofPattern("yyyy-MM-dd", Locale.ENGLISH).format(ldt));
System.out.println(ldt);

出力...

05-11-2018
2018-05-11
2018-05-11T17:24:42.980

Java 7 -

あなたは ThreeTen Backport を利用するべきです

元の答え

例えば...

Date myDate = new Date();
System.out.println(myDate);
System.out.println(new SimpleDateFormat("MM-dd-yyyy").format(myDate));
System.out.println(new SimpleDateFormat("yyyy-MM-dd").format(myDate));
System.out.println(myDate);

出力...

Wed Aug 28 16:20:39 EST 2013
08-28-2013
2013-08-28
Wed Aug 28 16:20:39 EST 2013

基礎となるDate値を変更したフォーマットはありません。これがDateFormattersの目的です

追加の例で更新しました

念のために、最初の例は意味がありません...

この例では、2つのフォーマッターを使用して同じ日付をフォーマットしています。次に、これらの同じフォーマッタを使用してStringの値をDatesに解析します。結果の解析によって、Dateがその値を報告する方法は変わりません。

Date#toStringはその内容の単なるダンプです。これは変更できませんが、Dateオブジェクトは好きなようにフォーマットできます。

try {
    Date myDate = new Date();
    System.out.println(myDate);

    SimpleDateFormat mdyFormat = new SimpleDateFormat("MM-dd-yyyy");
    SimpleDateFormat dmyFormat = new SimpleDateFormat("yyyy-MM-dd");

    // Format the date to Strings
    String mdy = mdyFormat.format(myDate);
    String dmy = dmyFormat.format(myDate);

    // Results...
    System.out.println(mdy);
    System.out.println(dmy);
    // Parse the Strings back to dates
    // Note, the formats don't "stick" with the Date value
    System.out.println(mdyFormat.parse(mdy));
    System.out.println(dmyFormat.parse(dmy));
} catch (ParseException exp) {
    exp.printStackTrace();
}

どの出力...

Wed Aug 28 16:24:54 EST 2013
08-28-2013
2013-08-28
Wed Aug 28 00:00:00 EST 2013
Wed Aug 28 00:00:00 EST 2013

フォーマットパターンにも注意してください。 SimpleDateFormat をよく見て、間違ったパターンを使用していないことを確認してください。

127
MadProgrammer
SimpleDateFormat("MM-dd-yyyy");

の代わりに

SimpleDateFormat("mm-dd-yyyy");

MM points Monthmm points minutes

SimpleDateFormat sm = new SimpleDateFormat("MM-dd-yyyy");
String strDate = sm.format(myDate);
31
newuser

'M'(首都)は月を表し、 'm'(単純)は分を表します

数ヶ月間のいくつかの例

'M' -> 7  (without prefix 0 if it is single digit)
'M' -> 12

'MM' -> 07 (with prefix 0 if it is single digit)
'MM' -> 12

'MMM' -> Jul (display with 3 character)

'MMMM' -> December (display with full name)

議事録の例

'm' -> 3  (without prefix 0 if it is single digit)
'm' -> 19
'mm' -> 03 (with prefix 0 if it is single digit)
'mm' -> 19
14
darshakat

tl; dr

LocalDate.parse( 
    "01-23-2017" , 
    DateTimeFormatter.ofPattern( "MM-dd-uuuu" )
)

詳細

フォーマットyyyy-mm-ddのJava.util.Dateがあります。

他にも述べたように、Dateクラスにはフォーマットがありません。 UTCで1970年の開始からミリ秒のカウントがあります。付帯条件なし。

Java.time

他のAnswersは、現在Java.timeクラスに取って代わられた、厄介な古いレガシー日時クラスを使用しています。

Java.util.Dateがある場合は、Instantオブジェクトに変換します。 Instant クラスは、 UTC の分解能で ナノ秒 (最大9桁の10進数)でタイムライン上の瞬間を表します分数)。

Instant instant = myUtilDate.toInstant();

タイムゾーン

他の答えはタイムゾーンの重大な問題を無視します。日付を決定するにはタイムゾーンが必要です。与えられた瞬間の間、日付はゾーンによって世界中で変わります。パリの真夜中から数分後のフランスは新しい日ですが、それでもモントリオールケベックでは「昨日」です。

自分のInstantのコンテキストに使用するタイムゾーンを定義します。

ZoneId z = ZoneId.of( "America/Montreal" );

ZoneIdを適用してZonedDateTimeを取得します。

ZonedDateTime zdt = instant.atZone( z );

LocalDate

時間なしで日付だけを気にする場合は、LocalDateを抽出します。

LocalDate localDate = zdt.toLocalDate();

標準のISO 8601フォーマット、YYYY-MM-DDで文字列を生成するには、単にtoStringを呼び出します。 Java.timeクラスは、文字列を生成または解析するときにデフォルトで標準フォーマットを使用します。

String output = localDate.toString();

2017-01-23

MM-DD-YYYYフォーマットが必要な場合は、フォーマットパターンを定義します。

DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM-dd-uuuu" );
String output = localDate.format( f );

フォーマットパターンコードでは大文字と小文字が区別されます。質問のコードは、mm(月の月)ではなくMM(時の分)を誤って使用していました。

解析には同じDateTimeFormatterオブジェクトを使用してください。 Java.timeクラスはスレッドセーフなので、このオブジェクトを保持し、スレッド間でも繰り返して再利用できます。

LocalDate localDate = LocalDate.parse( "01-23-2017" , f );

Java.timeについて

Java.time フレームワークは、Java 8以降に組み込まれています。これらのクラスは、 Java.util.DateCalendar 、& SimpleDateFormat のような、面倒な古い レガシー 日時クラスに代わるものです。

メンテナンスモード になった Joda-Time プロジェクトは、 Java.time クラスへの移行を推奨します。

詳しくは、 Oracle Tutorial を参照してください。そして多くの例と説明についてはStack Overflowを検索してください。指定は JSR 31 です。

Java.timeクラスはどこで入手できますか?

  • Java SE 8 および SE 9 以降
    • ビルトイン。
    • バンドル実装の標準Java APIの一部。
    • Java 9では、いくつかのマイナーな機能と修正が追加されています。
  • Java SE 6 および SE 7
    • Java.time機能の多くは ThreeTen-Backport でJava 6と7にバックポートされています。
  • Android

ThreeTen-Extra プロジェクトはJava.timeを追加のクラスで拡張します。このプロジェクトは、Java.timeに将来追加される可能性があることを証明するものです。 IntervalYearWeekYearQuartermore などの便利なクラスがあります。

3
Basil Bourque

それはコードの下の単純な使用法です。

final Date todayDate = new Date();

System.out.println(todayDate);

System.out.println(new SimpleDateFormat("MM-dd-yyyy").format(todayDate));

System.out.println(new SimpleDateFormat("yyyy-MM-dd").format(todayDate));

System.out.println(todayDate);
1
Ujitha

小さな "mm"月をそれが動作する大文字の "MM"に変更してください。以下は参考のためのサンプルコードです。

  **Date myDate = new Date();
    SimpleDateFormat sm = new SimpleDateFormat("MM-dd-yyyy");

    String strDate = sm.format(myDate);

    Date dt = sm.parse(strDate);
    System.out.println(strDate);**
0
Dilip