Javaで文字列を日付に変換
1.概要
このチュートリアルでは、
String
オブジェクトを
Date
オブジェクトに変換するいくつかの方法を探ります** 。日付の表現にも使用される古い
java.util.Date
データ型を見る前に、Java 8で導入された新しい
Date Time
API –
java.time
から始めましょう。
最後に、Joda-TimeとApache Commons LangのDateUtilsクラスを使用して変換するための外部ライブラリについても見ていきます。
2.
String
から
LocalDate
または
LocalDateTime
への変換
_日付を表し、後に日付と時刻を表す不変の日時オブジェクト。デフォルトでは、Javaの日付はISO-8601フォーマットなので、このフォーマットの日付と時刻を表す文字列があれば、これらのクラスの
parse()_
APIを直接使用できます。
ここ
この新しいAPIについてもう少し詳しく説明します。
2.1.
Parse
APIを使用する
T
Stringオブジェクトを
LocalDateおよびLocalDateTime
オブジェクトに変換するには、https://docs.oracle.com/javase/8/docs/api/java/time/format/に従って、
String
が有効な日付または時刻を表す必要があります
。 DateTimeFormatter.html#ISO
LOCAL
DATE[ISO
LOCAL
DATE]またはhttps://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html#ISO
LOCAL
DATE
TIME[ISO
LOCAL
DATE
TIME]。
そうでなければ、
DateTimeParseException
が実行時にスローされます。
最初の例では、
String
を
java.time
.
LocalDate
に変換しましょう。
LocalDate date = LocalDate.parse("2018-05-05");
上記と同様のアプローチを使用して、
String
を
java.time
.
LocalDateTime
に変換できます。
LocalDateTime dateTime = LocalDateTime.parse("2018-05-05T11:50:55");
LocalDate
と
LocalDateTime
の両方のオブジェクトはタイムゾーンに依存しないことに注意することが重要です。ただし、
タイムゾーン固有の日付と時刻を処理する必要がある場合は、
ZonedDateTime
parse
メソッドを直接使用してタイムゾーン固有の日付時刻を取得できます。
ZonedDateTime zonedDateTime = ZonedDateTime.parse("2015-05-05T10:15:30+01:00[Europe/Paris]");
それでは、文字列をカスタム形式で変換する方法を見てみましょう。
2.2. カスタムフォーマッタでの
Parse
APIの使用
カスタム日付フォーマットの
String
を
Date
オブジェクトに変換することは、Javaで広く行われている操作です。
この目的のために、** 多数の定義済みフォーマッタを提供する__DateTimeFormatterクラスを使用し、フォーマッタを定義できるようにします。
DateTimeFormatter
の定義済みフォーマッタの1つを使用する例から始めましょう。
String dateInString = "19590709";
LocalDate date = LocalDate.parse(dateInString, DateTimeFormatter.BASIC__ISO__DATE);
次の例では、「EEE、MMM d yyyy」のフォーマットを適用するフォーマッタを作成しましょう。この形式は、曜日のフルネームに3文字、月の日を表す1桁の数字、月を表す3桁の文字、および年を表す4桁の数字を指定します。
このフォーマッタは ”
Fri、2003年1月3日”や “Wed、1994年3月23日
“のような文字列を認識します
String dateInString = "Mon, 05 May 1980";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE, d MMM yyyy", Locale.ENGLISH);
LocalDate dateTime = LocalDate.parse(dateInString, formatter);
2.3. 一般的な日付と時刻のパターン
一般的な日付と時刻のパターンを見てみましょう。
-
y –
年(1996; 96) -
M –
年内の月(7月; 7月; 07) -
d
– 月の日(1〜31) -
E
– 週の中の曜日名(金曜日、日曜日) -
a
–
午前/午後のマーカー(AM、PM) -
H
– 1日の時間(0〜23) -
h
– 午前/午後の時(1〜12) -
m
– 時分(0〜60) -
s
– 分単位の秒数(0〜60)
解析パターンを指定するために使用できるシンボルの完全なリストについては、https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html#patterns[ここ]をクリックしてください。
java.time
の日付を古い
java.util.Date
オブジェクトに変換する必要がある場合は、リンク:/java-date-to-localdate-and-localdatetime[この]の記事を読んでください。
3.
String
から
java.util.Date
への変換
-
Java 8より前のバージョンでは、Javaの日付と時刻のメカニズムは
java.util.Date
、
java.util.Calendar
、および
java.util.TimeZone
クラスの古いAPIによって提供されていましたが、これらのクラスはまだ処理が必要な場合があります。
文字列を
java.util.Date
オブジェクトに変換する方法を見てみましょう。
SimpleDateFormat formatter = new SimpleDateFormat("dd-MMM-yyyy", Locale.ENGLISH);
String dateInString = "7-Jun-2013";
Date date = formatter.parse(dateInString);
上記の例では、最初に日付と時刻の形式を記述するパターンを渡すことで
SimpleDateFormat
オブジェクトを作成する必要があります。
次に、日付
String
を渡して
parse()
メソッドを呼び出す必要があります。
渡された
String
引数がパターンと同じフォーマットではない場合、
ParseException
がスローされます。
3.1.
java.util.Date
へのタイムゾーン情報の追加
-
java.util.Date
にはタイムゾーン** の概念はなく、UNIXのエポックタイム(1970-01-01T00:00:00Z)から経過した秒数のみを表すことに注意することが重要です。
しかし、
Date
オブジェクトを直接印刷すると、常にJavaのデフォルトのシステムタイムゾーンで印刷されます。
この最後の例では、タイムゾーン情報を追加して日付をフォーマットする方法を見ていきます。
SimpleDateFormat formatter = new SimpleDateFormat("dd-M-yyyy hh:mm:ss a", Locale.ENGLISH);
formatter.setTimeZone(TimeZone.getTimeZone("America/New__York"));
String dateInString = "22-01-2015 10:15:55 AM";
Date date = formatter.parse(dateInString);
String formattedDateString = formatter.format(date);
プログラムでJVMタイムゾーンを変更することもできますが、これはお勧めできません。
TimeZone.setDefault(TimeZone.getTimeZone("GMT"));
4.外部ライブラリ
コアJavaが提供する新旧のAPIを使用して
String
オブジェクトを
Date
オブジェクトに変換する方法をよく理解したので、次にいくつかの外部ライブラリを見てみましょう。
4.1. 上田タイムライブラリー
コアとなるJavaの
Date
および
Time
ライブラリの代替は、http://www.joda.org/joda-time/[Joda-Time]です。これが不可能な場合、著者は
java.time
(JSR-310)に移行することをユーザに推奨していますが、
Joda-Timeライブラリは日付と時刻を扱うための優れた代替手段を提供します
このライブラリは、Java 8 Date Dateプロジェクトでサポートされているほとんどすべての機能を提供します。
アーティファクトはhttps://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%22joda-time%22[Maven Central]で見つけることができます。
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.10</version>
</dependency>
これは標準の
DateTime
を使った簡単な例です。
DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss");
String dateInString = "07/06/2013 10:11:59";
DateTime dateTime = DateTime.parse(dateInString, formatter);
タイムゾーンを明示的に設定する例も見てみましょう。
DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss");
String dateInString = "07/06/2013 10:11:59";
DateTime dateTime = DateTime.parse(dateInString, formatter);
DateTime dateTimeWithZone = dateTime.withZone(DateTimeZone.forID("Asia/Kolkata"));
4.2. Apache Commons Lang – DateUtils
DateUtils
クラスには、従来の
Calendar
オブジェクトおよび
Date
オブジェクトとの連携を容易にする多くの
便利なユーティリティが用意されています
。
commons-lang3成果物は、https://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%22commons-lang3%22[Maven Central]から入手できます。
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.7</version>
</dependency>
Array
の日付パターンを使用して日付
String
を
java.util.Date
に変換しましょう。
String dateInString = "07/06-2013";
Date date = DateUtils.parseDate(dateInString,
new String[]{ "yyyy-MM-dd HH:mm:ss", "dd/MM-yyyy" });
5.まとめ
この記事では、単純なJavaと外部ライブラリーの両方で、Stringをさまざまなタイプの
Date
オブジェクトに(時間の有無にかかわらず)変換する方法をいくつか説明しました。
この記事の全ソースコードはhttps://github.com/eugenp/tutorials/tree/master/libraries[over GitHub]から入手できます。