web-dev-qa-db-ja.com

Joda-TimeDateTimeを変換します-ISO8601形式の日付を別の日付形式に変換します

私のJavaアプリの中で Joda-Time を使用して、アプリユーザーが入力した日付をMM/dd/yyyyからISO8601形式に変換してDBに保存します。

誰かがJoda-Timeを使用して ISO 8601 日付をMM/dd/yyyy形式に戻す方法を教えてもらえますか?

私のコードは、ユーザーの日付をISO8601の日付形式に変換します。

String date1 = "05/05/2013";
DateTimeFormatter parser1 = DateTimeFormat.forPattern("MM/dd/yyyy");
DateTime dateTimeObj1 = DateTime.parse(date1,parser1);
DateTimeFormatter isoDateFormat = ISODateTimeFormat.dateTime();
String isoDateStr = isoDateFormat.print(dateTimeObj1);
System.out.println(isoDateStr);
10
MChan

同じフォーマッタを使用する

あなたは同じDateTimeFormatterオブジェクトを使用して、 Joda-Timeprint(文字列をレンダリング)に関して解析します2.3。

タイムゾーン

コードが タイムゾーン のアドレス指定を怠っていることに注意してください。その場合、JVMのデフォルトのタイムゾーンを取得します。良い習慣ではありません。

DateTimeは、日付と時刻の両方を表します。日付部分のみの文字列を解析する場合、時間部分は自動的にその日の最初の瞬間に設定されます。その最初の瞬間はタイムゾーンによって異なります。したがって、異なるタイムゾーンを適用すると、異なる結果、宇宙のタイムラインに沿った異なるポイント、Epoch以降の異なるミリ秒が得られます。

フォーマッターを定義するときは、 withZone の呼び出しに注意してください。

文字列

DateTimeオブジェクトはnot文字列であることに注意してください。次のいずれかの方法で、DateTime内に含まれる日時情報の文字列表現を生成できます。

  • DateTimeインスタンスでtoStringメソッドを呼び出します。
    すべてのDateTimeには組み込みの ISO 8601formatter があり、「toString」メソッドによって自動的に使用されます。
  • 独自のDateTimeFormatterインスタンスをインスタンス化します。

これらの文字列生成手法は両方とも、以下のサンプルコードに示されています。

サンプルコード

// Usually better to specify a time zone than rely on default.
DateTimeZone timeZone = DateTimeZone.forID( "Asia/Hong_Kong" );
DateTimeFormatter formatter = DateTimeFormat.forPattern( "MM/dd/yyyy" ).withZone( timeZone );

// Parse string into a DateTime. Define the format.
String input = "05/05/2013";
DateTime dateTime = formatter.parseDateTime( input ); // Defaults to first moment of the day.

// Render date-time as an ISO 8601 string. The "toString" method on DateTime defaults to a built-in ISO 8601 formatter.
// A DateTime object is not itself a string. But a DateTime can generate a string by calling its "toString" method.
String iso8601String = dateTime.toString();

// Parse string into a DateTime. Passing to constructor conveniently uses the built-in ISO 8601 parser built into DateTime class.
DateTime dateTime2 = new DateTime( iso8601String, timeZone );

// Render date-time as a string in a particular format.
String output = formatter.print( dateTime2 );

特定の形式をハードコーディングするのではなく、ローカライズされた形式をソフトコーディングできます。

String outputUS = DateTimeFormat.forStyle( "S-" ).withLocale( Locale.US ).print( dateTime2 );
String outputQuébécois = DateTimeFormat.forStyle( "F-" ).withLocale( Locale.CANADA_FRENCH ).print( dateTime2 );

コンソールにダンプ…

System.out.println( "dateTime: " + dateTime ); // Implicit call to "toString" method in DateTime class generates a new string using a built-in formatter for ISO 8601 format.
System.out.println( "iso8601String: " + iso8601String );
System.out.println( "dateTime2: " + dateTime2 ); // Another implicit call to "toString" method on DateTime class. Generates a new string in ISO format.
System.out.println( "output: " + output );

実行すると…

dateTime: 2013-05-05T00:00:00.000+08:00
iso8601String: 2013-05-05T00:00:00.000+08:00
dateTime2: 2013-05-05T00:00:00.000+08:00
output: 05/05/2013

文字列は日時ではありません

日時オブジェクトを文字列とは考えないでください。

DateTimeには形式がありません。そのクラスは、ISO 8601形式の文字列を解析して、日時オブジェクトをインスタンス化できます。同様に、DateTimeFormatterは文字列を解析して、日時オブジェクトをインスタンス化できます。

反対方向に進むと、DateTimeにはtoString実装があり、日時オブジェクトの値の文字列表現を生成します。同様に、DateTimeFormatterは、日時オブジェクトの値の文字列表現を生成できます。

これらすべての場合において、文字列表現は完全に異なり、日時オブジェクトとは別のものです。

23
Basil Bourque