1概要

このチュートリアルでは、Javaで

Date

オブジェクトを

String

オブジェクトに変換する方法を説明します。そのためには、古い

java.util.Date

タイプと、Java 8で導入された新しい

Date/Time

APIを使用します。

逆の変換、つまり

String

から

Date

型への変換方法を知りたい場合は、https://www.baeldung.com/java-string-to-date[このチュートリアル]をご覧ください。

新しいDate/Time APIに関する詳細は、https://www.baeldung.com/java-8-date-time-intro[このチュートリアル]を参照してください。

2.

java.util.Date



String

に変換する

Java 8を使用している場合は

java.util.Date

を使用するべきではありませんが、選択できないことがあります(たとえば、自分の管理下にないライブラリから

Date

オブジェクトを受け取っているなど)。

そのような場合、

java.util.Date



String

に自由に変換する方法がいくつかあります。

2.1.

Date

オブジェクトの準備

まず、期待される

String

表現の日付を宣言し、希望の日付形式のパターンを定義しましょう。

private static final String EXPECTED__STRING__DATE = "Aug 1, 2018 12:00 PM";
private static final String DATE__FORMAT = "MMM d, yyyy HH:mm a";

今度は、変換したい実際の

Date

オブジェクトが必要です。作成には

Calendar

インスタンスを使用します。

TimeZone.setDefault(TimeZone.getTimeZone("CET"));
Calendar calendar = Calendar.getInstance();
calendar.set(2018, Calendar.AUGUST, 1, 12, 0);
Date date = calendar.getTime();

後で新しいAPIを使用するときに問題が発生しないように、デフォルトの

TimeZone



CET

に設定しています。

Date

自体にはタイムゾーンはありませんが、

toString()

は現在のデフォルトのタイムゾーンを使用します** 。

以下の例では、この

Date

インスタンスを使用します。

2.2.

SimpleDateFormat

クラスを使用する

この例では、


SimpleDateFormat


クラスの

format()

メソッドを使用します。日付形式を使用して、そのインスタンスを作成しましょう。

DateFormat formatter = new SimpleDateFormat(DATE__FORMAT);

この後、日付をフォーマットして予想される出力と比較することができます。

String formattedDate = formatter.format(date);

assertEquals(EXPECTED__STRING__DATE, formattedDate);

2.3. 抽象

DateFormat

クラスの使用

ご覧のとおり、

SimpleDateFormat

は抽象

DateFormat

クラスのサブクラスです。このクラスは日付と時刻の書式設定のためのさまざまなメソッドを提供します。

上記と同じ結果を得るために使用します。

String formattedDate = DateFormat
  .getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT)
  .format(date);

このアプローチでは、日付に

MEDIUM

、時間に

SHORT

というスタイルパターンを渡しています。

3.

Formatter

クラスを使う

前の例と同じ

String

を取得するもう1つの簡単な方法は、

Formatter

クラスを使用することです。

これは最も読みやすい解決策ではないかもしれませんが、

特にマルチスレッド環境では

スレッドセーフなone-linerが役に立ちます(

SimpleDateFormat

はスレッドセーフではないことに注意してください)。

String formattedDate = String.format("%1$tb %1$te, %1$tY %1$tI:%1$tM %1$Tp", date);


1 $

を使用して、すべてのフラグで使用する引数を1つだけ渡します。フラグの詳細な説明は

Formatter

クラスのhttps://docs.oracle.com/javase/8/docs/api/java/util/Formatter.html#dt[Date/Time Conversions]部分]にあります。

4. Java 8を使った変換

日付/時刻API

Java 8の

Date/Time

APIは、

java.util.Date

および

__java.util.Calendar


classesよりはるかに強力です。可能な限り使用するようにしてください。既存の

Date

オブジェクトを

String__に変換するために使用する方法を見てみましょう。

今回は、


DateTimeFormatter


クラスとその

format()

メソッドも使用します。同じ日付パターンとして、セクション2.1で宣言されています。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DATE__FORMAT);

新しいAPIを使用するには、

Date

オブジェクトを

Instant

オブジェクトに変換する必要があります。

Instant instant = date.toInstant();

期待される

String

には日付と時刻の両方の部分があるので、**

Instant

オブジェクトを

LocalDateTime

に変換する必要があります。

LocalDateTime ldt = instant
  .atZone(ZoneId.of("CET"))
  .toLocalDateTime();

そして最後に、フォーマットされた

String

を簡単に取得できます。

String formattedDate = ldt.format(formatter);

5.まとめ

この記事では、

java.util.Date

オブジェクトを

String

** に変換するいくつかの方法を説明しました。最初に、古い

java.util.Date

クラスと

__java.util.Calendar

__classesクラス、およびそれに対応する日付フォーマットクラスを使用してその方法を示しました。

それから

Formatter

クラスを使い、最後にJava 8 Date/Time APIを使いました。

いつものように、完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/java-strings[over on GitHub]にあります。