Javaで文字列を日付に変換する
1. 概要
このチュートリアルでは、we’ll explore several ways to convert String objects into Date objects。 日付の表現にも使用される古いjava.util.Dateデータ型を確認する前に、Java 8で導入された新しいDate Time API –java.timeから始めます。
最後に、Joda-TimeとApache Commons LangDateUtilsクラスを使用して変換するためのいくつかの外部ライブラリについても見ていきます。
2. StringをLocalDateまたはLocalDateTimeに変換する
[.s1]#LocalDate #and LocalDateTime are日付を表し、後に日付と時刻を表す不変の日時オブジェクト。 デフォルトでは、Javaの日付はISO-8601形式であるため、この形式で日付と時刻を表す文字列がある場合は、we can use the parse() API of these classes directlyになります。
Hereは、この新しいAPIについてもう少し詳しく説明しています。
2.1. ParseAPIの使用
ISO_LOCAL_DATEまたはISO_LOCAL_DATE_TIMEに応じたThe Date-Time API provide parse() methods for parsing a String that contains date and time information. To convert String objects to LocalDate and LocalDateTime objects, the String must represent a valid date or 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オブジェクトはどちらもタイムゾーンに依存しないことに注意することが重要です。 ただし、when we need to deal with time zone specific date and times we can use the ZonedDateTimeparseメソッドを直接使用して、タイムゾーン固有の日時を取得します。
ZonedDateTime zonedDateTime = ZonedDateTime.parse("2015-05-05T10:15:30+01:00[Europe/Paris]");
それでは、カスタム形式で文字列を変換する方法を見てみましょう。
2.2. カスタムフォーマッタでのParseAPIの使用
カスタム日付形式のStringをDateオブジェクトに変換することは、Javaで広く行われている操作です。
この目的のために、we’ll use the DateTimeFormatter class which provides numerous predefined formatters,を使用して、フォーマッターを定義できます。
DateTimeFormatterの事前定義されたフォーマッタの1つを使用する例から始めましょう。
String dateInString = "19590709";
LocalDate date = LocalDate.parse(dateInString, DateTimeFormatter.BASIC_ISO_DATE);
次の例では、「EEE、MMMdyyyy」のフォーマットを適用するフォーマッターを作成しましょう。 この形式では、週の完全な曜日名に3文字、月の日を表す1桁、月を表す3文字、年を表す4桁を指定します。
このフォーマッタは、「Fri, 3 Jan 2003″ or “Wed, 23 Mar 1994」などの文字列を認識します。
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)
解析用のパターンを指定するために使用できる記号の完全なリストについては、hereをクリックしてください。
java.timeの日付を古いjava.util.Dateオブジェクトに変換する必要がある場合は、thisの記事で詳細を確認してください。
3. Stringをjava.util.Dateに変換する
Before Java 8, the Java date and time mechanism was provided by the old APIs of java.util.Date, java.util.Calendar, and java.util.TimeZone classesは、まだ作業が必要な場合があります。
文字列をjava.util.Dateオブジェクトに変換する方法を見てみましょう。
SimpleDateFormat formatter = new SimpleDateFormat("dd-MMM-yyyy", Locale.ENGLISH);
String dateInString = "7-Jun-2013";
Date date = formatter.parse(dateInString);
上記の例では、日付と時刻の形式を説明するパターンを渡すことにより、we first need to construct a SimpleDateFormat objectを実行します。
次に、日付Stringを渡すparse()メソッドを呼び出す必要があります。 渡されたString引数がパターンと同じ形式でない場合、ParseExceptionがスローされます。
3.1. java.util.Dateへのタイムゾーン情報の追加
It’s important to note that the java.util.Date has no concept of time zoneであり、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. ジョーダタイム図書館
コアJavaDateおよびTimeライブラリの代替はJoda-Timeです。 現在、作成者はユーザーにjava.time(JSR-310)に移行することを推奨していますが、これが不可能な場合は、Joda-Time library provides an excellent alternative for working with Date and Timeに移行してください。 このライブラリは、Java 8Date Timeプロジェクトでサポートされているほとんどすべての機能を提供します。
アーティファクトはMaven Centralにあります。
joda-time
joda-time
2.10
標準の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クラスは多くのuseful utilities making it easier to work with the legacy Calendar and Date objectsを提供します。
commons-lang3アーティファクトは、Maven Centralから入手できます。
org.apache.commons
commons-lang3
3.7
日付パターンの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と外部ライブラリの両方で、文字列をさまざまなタイプのDateオブジェクト(時間の有無にかかわらず)に変換するいくつかの方法を説明しました。
記事の完全なソースコードはover on GitHubで入手できます。