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.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に設定しました。 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 environment(SimpleDateFormatはスレッドセーフではないことに注意してください):
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にあります。