1. 概要

このチュートリアルでは、JavaでDateオブジェクトをStringオブジェクトに変換する方法を示します。 そのために、古い java .util.Date タイプと、Java8で導入された新しいDate / TimeAPIを使用します。

逆の変換、つまりStringからDateタイプへの変換方法を知りたい場合は、このチュートリアルをここで確認できます。

新しい日付/時刻APIの詳細については、この関連チュートリアルを参照してください。

2. java.util.DateStringに変換しています

Java 8を使用している場合は、 java .util.Date を使用するべきではありませんが、選択の余地がない場合があります(たとえば、 Date を受信している場合)。私たちの管理下にないライブラリからのオブジェクト)。

このような場合、java.util.DateStringに自由に変換する方法がいくつかあります。

2.1. 日付オブジェクトの準備

まず、日付の予想される 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を使用する際の問題を防ぐために、デフォルトのTimeZoneCETに設定しました。 日付自体にはタイムゾーンがありませんが、その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. フォーマッタークラスの使用

前の例と同じStringを取得する別の簡単な方法は、Formatterクラスを使用することです。

これは最も読みやすいソリューションではないかもしれませんが、これはスレッドセーフなワンライナーであり、特にマルチスレッド環境で役立つ可能性がありますSimpleDateFormatに注意する必要があります]はスレッドセーフではありません):

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

1 $ を使用して、すべてのフラグで使用される引数を1つだけ渡すことを示しました。 フラグの詳細な説明は、FormatterクラスのDate/ Time Conversionspartにあります。

4. Java8日付/時刻APIを使用した変換

Java8のDate/ Time APIは、java.util.Dateおよびjava.util.Calendarクラスよりもはるかに強力であり、これを使用する必要があります。いつでも可能なとき。 既存の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クラスと対応する日付フォーマットクラスを使用してこれを行う方法を示しました。

次に、 Formatter クラスを使用し、最後にJava 8 Date /TimeAPIを使用しました。

いつものように、完全なソースコードはGitHubにあります。