java.util.Dateを文字列に変換する

java.util.Dateを文字列に変換

1. 概要

このチュートリアルでは、convert Date objects to String objects in Javaを実行する方法を示します。 そのために、古いjava.util.Dateタイプと、Java 8で導入された新しいDate/TimeAPIを使用します。

逆の変換、つまりStringからDateタイプへの変換方法を学びたい場合は、this tutorial hereをチェックしてください。

新しいDate/Time APIの詳細については、this related tutorialを参照してください。

2. java.util.DateStringに変換する

Java 8を使用している場合は、java.util.Dateを使用するべきではありませんが、選択の余地がない場合があります(たとえば、制御されていないライブラリからDateオブジェクトを受け取っている場合)。 。

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

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を使用する際の問題を防ぐために、デフォルトのTimeZoneCETに設定しました。 the Date itself doesn’t have any time zone, but its toString() uses the current default time zoneに注意する必要があります。

以下のすべての例では、この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を取得する別の簡単な方法は、Formatterクラスを使用することです。

これは最も読みやすい解決策ではないかもしれませんが、it is a thread-safe one-liner that could be useful, especially in a multi-threaded environmentSimpleDateFormatはスレッドセーフではないことに注意してください):

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

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

4. Java 8Date/Time 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を使用するには、convert our Date object to an Instant object:を実行する必要があります

Instant instant = date.toInstant();

予想されるStringには日付と時刻の両方の部分があるため、we also need to convert the Instant object to LocalDateTime:

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

そして最後に、フォーマットされたStringを簡単に取得できます。

String formattedDate = ldt.format(formatter);

5. 結論

この記事では、several ways of converting java.util.Date objects to Stringについて説明しました。 最初に、古いjava.util.Dateクラスとjava.util.Calendar クラス、および対応する日付フォーマットクラスを使用してこれを行う方法を示しました。

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

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