現在、面倒な古い日時クラスを使用していますが、現在はjava.timeクラスに置き換えられています。
間違った入力データ
21日は月曜日ではない火曜日であるとしてあなたの最初の例の文字列は、間違っています。 22番目の例の文字列は正しく、以下の私のコード例で使用されています。 java.time
を使用して
は、日付・時刻の値のテキスト表現のためのフォーマットのこの種を使用することは避けてください。特に、この種の形式で表示されるEST
やIST
のような3〜4文字の略語は、実際のタイムゾーンではなく、標準化されておらず、ユニークではない(!)ので使用しないでください。 proper time zone nameを指定します。この特定の場合、java.timeはGMT
をUTCとして変換できますが、他の値は失敗する可能性があります。
String input = "Tue May 22 14:52:00 GMT 2012";
DateTimeFormatter f = DateTimeFormatter.ofPattern ("EEE MMM dd HH:mm:ss z uuuu").withLocale (Locale.US);
ZonedDateTime zdt = ZonedDateTime.parse (input , f);
System.out.println ("zdt: " + zdt);
コンソールにダンプします。 toString
メソッドは、標準のISO 8601形式の文字列を生成し、大括弧内にゾーンの名前を追加して拡張します。これらの標準形式は、日時の値をテキストにシリアライズする必要がある場合には、はるかに優れた選択肢です。
System.out.println ("zdt: " + zdt);
ZDT:2012-05-22T14:52Z [GMT]
あなたはあなたが望む任意の形式で、この値を表す文字列を生成することができます文字列
を生成します。通常は、Locale
とDateTimeFormatter
を使用して自動的にjava.timeをローカライズするのが最適です。
希望するフォーマットでは、日付部分には中程度のスタイルを使用しますが、時刻部分には短いスタイルを使用します。幸いにも、DateTimeFormatter
は、FormatStyle
オブジェクトのペアを渡すここに見られるように、各部分を別々にローカライズすることを可能にします。
Locale l = Locale.US; // Or Locale.CANADA_FRENCH, or Locale.ITALY, etc.
DateTimeFormatter fOutput = DateTimeFormatter.ofLocalizedDateTime (FormatStyle.MEDIUM , FormatStyle.SHORT).withLocale (l);
String output = zdt.format (fOutput);
コンソールにダンプします。
System.out.println ("zdt: " + zdt + " | output: " + output);
ZDT:2012-05-22T14:52Z [GMT] |出力:2012年5月22日14:52
java.timeについて
java.timeフレームワークは、Java 8に組み込まれており、後にされています。これらのクラスは、java.util.Date
、.Calendar
、& java.text.SimpleDateFormat
などの古い面倒な日時クラスに取って代わります。
にあるJoda-Timeプロジェクトは、java.timeへの移行を推奨しています。
詳しくはOracle Tutorialをご覧ください。そして、多くの例と説明のためにStack Overflowを検索してください。
java.time機能ThreeTen-BackportでJava 6 & 7に戻って、移植、さらにThreeTenABPでAndroidに適合されているの多く(How to use…を参照)。
ThreeTen-Extraプロジェクトは、追加のクラスでjava.timeを拡張します。このプロジェクトは、将来のjava.timeへの追加の可能性を証明する土台です。ここでは、Interval
、YearWeek
、YearQuarter
などの便利なクラスがあります。
どういう例外がありますか? –
何が例外でしたか? – Jeshurun
あなたの例文の上には21日があります。月曜日は火曜日ではありません。サンプルコードとは異なります。 –