Javaの文字列から日付への変換
Javaで 'January 2, 2010'というフォーマットの文字列
を日付
に変換するには、どのような方法がありますか?
最終的には,月,日,年を整数にして
Date date = new Date();
date.setMonth()..
date.setYear()..
date.setDay()..
date.setlong currentTime = date.getTime();
を使って日付を時間に変換できるようにしたいのです。
844
3
これらの
java.util.Date
セッターメソッドは、Java 1.1 (1997) 以降、非推奨となっています。単純にSimpleDateFormat
を使って、入力文字列にマッチするフォーマットパターンを使って日付をフォーマットします。具体的には、入力文字列として "January 2, 2010" を指定した場合です。
MMMM
パターンを使用します。d
パターンを使用します。yyyy
パターンを使用してください。明示的な
Locale
引数の重要性に注意してください。これを省略すると、入力文字列の月名で使用されている英語とは限らないデフォルトロケールが使用されます。ロケールが入力文字列と一致しない場合、フォーマットパターンが有効であるにもかかわらず、紛らわしいことにjava.text.ParseException
が発生してしまいます。ここでは、利用可能なすべてのフォーマットパターンをリストアップしたjavadocから関連性のある部分を抜粋しています。
パターンは大文字小文字を区別し、4文字以上のテキストベースのパターンは完全な形を表すことに注意してください。それ以外の場合は、短いまたは省略された形があればそれが使用されます。そのため、例えば
MMMMM
以上のパターンは不要です。以下は、与えられた文字列を解析して日付を算出するための、有効な
SimpleDateFormat
パターンの例です。重要な注意点として、
SimpleDateFormat
はスレッドセーフではありません。つまり、これをスタティック変数やインスタンス変数として宣言して割り当て、別のメソッドやスレッドで再利用することは絶対に避けてください。必ずメソッドのローカルスコープ内で新規に作成する必要があります。Java 8 アップデート
Java 8以降をお使いの方は、
DateTimeFormatter
をお使いください(こちらのリンクをクリックすると、すべての定義済みフォーマッタと利用可能なフォーマットパターンが表示されます;チュートリアルはこちら)。この新しいAPIはJodaTimeにインスパイアされています。注意:もしあなたのフォーマットパターンがたまたま時間の部分も含んでいるならば、
LocalDate#parse(text, formatter)
の代わりにLocalDateTime#parse(text, formatter)
を使ってください。また、フォーマットパターンにたまたまタイムゾーンが含まれている場合は、ZonedDateTime#parse(text, formatter)
を使用してください。ここでは、利用可能なすべてのフォーマットパターンを列挙したthe javadocから関連性のある部分を抜粋しています。
なお、よく使われるパターンについては、いくつかの定義済みフォーマッタが用意されています。ですから、たとえば
DateTimeFormatter.ofPattern("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH);
の代わりにDateTimeFormatter.RFC_1123_DATE_TIME
を使用することができます。これが可能なのは、SimpleDateFormat
とは対照的に、スレッドセーフだからです。必要に応じて独自に定義することもできます。2016-09-26T17:44:57Zのような標準的なISO 8601の日付は、
LocalDateTime#parse(text)
で直接解析することができます。これはISO_LOCAL_DATE_TIME
フォーマッタを既に使用しているからです。同様に,LocalDate#parse(text)
はISOの日付から時間成分を除いたものを解析し(ISO_LOCAL_DATE`参照),ZonedDateTime#parse(text)
はISOの日付にオフセットとタイムゾーンを加えたものを解析します(ISO_ZONED_DATE_TIME`参照)。またしても、Javaの日付に関する議論です。 日付の操作には、Date、Calendar、[GregorianCalendar][3]、[SimpleDateFormat][4]を使います。 例えば、1月の日付を入力とすると
と入力すると、次のような操作が可能になります。
[3]: http://download.oracle.com/javase/6/docs/api/java/util/GregorianCalendar.html [4]: http://download.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html
SimpleDateFormatクラスを扱う上で、Dateはスレッドセーフではなく、1つのDateオブジェクトを複数のスレッドで共有することはできないことを覚えておきましょう。
また、"m"と"M"には大きな違いがあり、分には小文字が、月には大文字が使われます。また、"d"と"D"も同様です。これは見落とされがちな微妙なバグの原因となります。詳細はJavadocまたはGuide to Convert String to Date in Javaを参照してください。