tl;dr
LocalDateTime ldt = LocalDateTime.parse( "2012-01-10 23:13:26".replace( " " , "T" ) );
…そして…</p>
LocalDate localDate = LocalDate.parse ( "January 13, 2012" , DateTimeFormatter.ofLocalizedDate ( FormatStyle.LONG ).withLocale ( Locale.US ) );
詳細
Jonikによる回答は基本的に正しいですが、いくつかの重要な問題を見逃しています。
java.time
Joda より優れたものがあれば、それも教えてください。
はい、Java.timeフレームワークというより良いものがあります。Joda-Time チームは、その後継として java.time への移行を推奨しています。
java.timeフレームワークは、Java 8 以降に組み込まれています。java.util.Date
これらのクラスは、 、.Calendar
、 &などの古い面倒な日時クラスに取って代わりますjava.text.SimpleDateFormat
。
詳細については、 Oracle チュートリアルを参照してください。また、Stack Overflow で多くの例と説明を検索してください。
java.time 機能の多くは、ThreeTen-Backportで Java 6 および 7 にバックポートされ、さらにThreeTenABPで Android に適合されています。
日付時刻
最初の入力は、日付と時刻です。UTCからのオフセットまたはタイム ゾーン情報がないため、オブジェクトとして解析しLocalDateTime
ます。「Local…」は特定の地域ではなく、任意の地域を意味します。したがって、これはタイムライン上の実際の瞬間ではなく、その瞬間についての大まかな考えにすぎません。
入力文字列を解析するため2012-01-10 23:13:26
に、中央の SPACE を a に置き換えて、日時値のISO 8601T
標準形式の正規のスタイルに準拠させることができます。
java.time クラスは、日時値のテキスト表現を解析および生成する際に、デフォルトで ISO 8601 形式を使用します。したがって、解析パターンを定義する必要はありません。
String input = "2012-01-10 23:13:26".replace( " " , "T" );
LocalDateTime ldt = LocalDateTime.parse( input );
この値のコンテキストから目的のタイム ゾーンがわかっている場合は、それを適用して、タイムライン上の実際の瞬間を定義します。
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ldt.atZone( zoneId );
コンソールにダンプします。
System.out.println ( "input: " + input + " | zdt: " + zdt );
入力: 2012-01-10T23:13:26 | zdt: 2012-01-10T23:13:26-05:00[アメリカ/モントリオール]
日付のみ
2 番目の入力は、時刻とタイム ゾーンのない日付のみの値です。そのためにはLocalDate
クラスが必要です。
その入力の形式は、米国の言語 (英語) および文化的規範に準拠していると認識しています。したがって、書式設定パターンを明示的に指定する必要はありません。を指定することで、その US 形式を認識しているフォーマッタを簡単に要求できますLocale
。FormatStyle.LONG
この形式の長さは適宜指定します。
String input = "January 13, 2012";
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDate ( FormatStyle.LONG ).withLocale ( Locale.US );
LocalDate localDate = LocalDate.parse ( input , formatter );
コンソールにダンプします。
System.out.println ( "input: " + input + " | localDate: " + localDate );
入力: 2012 年 1 月 13 日 | localDate: 2012-01-13