1. 概要

このチュートリアルでは、文字列オブジェクトを日付オブジェクトに変換するいくつかの方法を探ります。 古いjava.utilを確認する前に、Java8で導入された新しいDate Time API、 java.timeから始めます。 .Date データ型は、日付の表現にも使用されます。

結論として、Joda-TimeとApache Commons Lang DateUtilsクラスを使用して変換するためのいくつかの外部ライブラリを見ていきます。

2. StringLocalDateまたはLocalDateTimeに変換しています

LocalDate とLocalDateTimeは、それぞれ日付と日付と時刻を表す不変の日時オブジェクトです。 デフォルトでは、Javaの日付はISO-8601形式であるため、この形式で日付と時刻を表す文字列がある場合は、これらのクラスのparse()APIを直接使用できます

ここ‘この新しいAPIについてもう少し詳しく説明します。

2.1. ParseAPIの使用

T Date-Time APIは、日付と時刻の情報を含む文字列を解析するためのparse()メソッドを提供します。 StringオブジェクトをLocalDateおよびLocalDateTimeオブジェクトに変換するには、Stringが有効な日付または時刻を表す必要がありますによると ISO_LOCAL_DATE また ISO_LOCAL_DATE_TIME

それ以外の場合は、実行時にDateTimeParseExceptionがスローされます。

最初の例では、Stringjava.timeLocalDateに変換してみましょう。

LocalDate date = LocalDate.parse("2018-05-05");

上記と同様のアプローチを使用して、Stringjava.timeLocalDateTimeに変換できます。

LocalDateTime dateTime = LocalDateTime.parse("2018-05-05T11:50:55");

LocalDateオブジェクトとLocalDateTimeオブジェクトはどちらもタイムゾーンに依存しないことに注意してください。 ただし、タイムゾーン固有の日時を処理する必要がある場合は、ZonedDateTime parse メソッドを直接使用して、タイムゾーン固有の日時を取得できます。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z");
ZonedDateTime zonedDateTime = ZonedDateTime.parse("2015-05-05 10:15:30 Europe/Paris", formatter);

次に、カスタム形式で文字列を変換する方法を見てみましょう。

2.2. カスタムフォーマッタでのParseAPIの使用

カスタム日付形式のStringDateオブジェクトに変換することは、Javaで広く行われている操作です。

この目的のために、 DateTimeFormatterクラスを使用します。これは、多数の事前定義されたフォーマッターを提供し、フォーマッターを定義できるようにします。

DateTimeFormatterの事前定義されたフォーマッターの1つを使用する例から始めましょう。

String dateInString = "19590709";
LocalDate date = LocalDate.parse(dateInString, DateTimeFormatter.BASIC_ISO_DATE);

次の例では、「EEE、MMMdyyyy」のフォーマットを適用するフォーマッタを作成しましょう。 この形式では、曜日を表す3文字、月の日を表す1桁、月を表す3文字、および年を表す4桁を指定します。

このフォーマッタは、「金、2003年1月3日」または「水、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マーカー(AM、PM)
  • H – 1日の時間(0-23)
  • h –午前/午後の時間(1-12)
  • m –時間単位の分(0-60)
  • s –秒(0-60)

解析のパターンを指定するために使用できる記号の完全なリストについては、ここをクリックをクリックしてください。

java.time日付を古いjava.util.Dateオブジェクトに変換する必要がある場合は、thisの記事で詳細を確認してください。

3. Stringjava.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. 城田タイムライブラリー

コアJavaDateおよびTimeライブラリの代替はJoda-Timeです。 著者は現在、ユーザーが java .time (JSR-310)に移行することを推奨していますが、これが不可能な場合は、Joda-TimeライブラリがDateおよび時間。 このライブラリは、Java 8 DateTimeプロジェクトでサポートされているほとんどすべての機能を提供します。

アーティファクトはMavenCentralにあります。

<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アーティファクトは、 MavenCentralから入手できます。

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.12.0</version>
</dependency>

日付パターンの配列を使用して、日付Stringjava.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 オブジェクト(時間の有無にかかわらず)に変換するいくつかの方法を説明しました。

この記事の完全なソースコードは、GitHubから入手できます。