私の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);
あなたは同じDateTimeFormatterオブジェクトを使用して、 Joda-Time のprint
(文字列をレンダリング)に関して解析します2.3。
コードが タイムゾーン のアドレス指定を怠っていることに注意してください。その場合、JVMのデフォルトのタイムゾーンを取得します。良い習慣ではありません。
DateTimeは、日付と時刻の両方を表します。日付部分のみの文字列を解析する場合、時間部分は自動的にその日の最初の瞬間に設定されます。その最初の瞬間はタイムゾーンによって異なります。したがって、異なるタイムゾーンを適用すると、異なる結果、宇宙のタイムラインに沿った異なるポイント、Epoch以降の異なるミリ秒が得られます。
フォーマッターを定義するときは、 withZone
の呼び出しに注意してください。
DateTimeオブジェクトはnot文字列であることに注意してください。次のいずれかの方法で、DateTime内に含まれる日時情報の文字列表現を生成できます。
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
は、日時オブジェクトの値の文字列表現を生成できます。
これらすべての場合において、文字列表現は完全に異なり、日時オブジェクトとは別のものです。