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]から入手できます。