1. 概要

このチュートリアルでは、インスタントをJavaの文字列にフォーマットする方法を説明します。

まず、Javaのインスタントについて少し背景を説明します。 次に、コアJavaとJoda-Timeなどのサードパーティライブラリを使用して、中心的な質問に答える方法を紹介します。

2. コアJavaを使用したインスタントフォーマット

Javaドキュメントによると、インスタントは1970-01-01T00:00:00ZのJavaエポックから測定されたタイムスタンプです。

Java 8には、タイムライン上の特定の瞬間的なポイントを表すInstantと呼ばれる便利なクラスが付属しています。 通常、このクラスを使用して、アプリケーションのイベントタイムスタンプを記録できます。

Javaのインスタントがわかったので、それをStringオブジェクトに変換する方法を見てみましょう。

2.1. DateTimeFormatterクラスの使用

一般的に、Instantオブジェクトをフォーマットするにはフォーマッターが必要です。 幸いなことに、Java8はDateTimeFormatter クラスを導入して、日付と時刻を均一にフォーマットしました。

基本的に、 DateTimeFormatter は、ジョブを実行するための format()メソッドを提供します。

簡単に言うと、 DateTimeFormatterには、インスタントをフォーマットするためのタイムゾーンが必要です。 これがないと、インスタントを人間が読める形式の日付/時刻フィールドに変換できません。

たとえば、dd.MM.yyyy形式を使用してInstantインスタンスを表示するとします。

public class FormatInstantUnitTest {
    
    private static final String PATTERN_FORMAT = "dd.MM.yyyy";

    @Test
    public void givenInstant_whenUsingDateTimeFormatter_thenFormat() {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(PATTERN_FORMAT)
            .withZone(ZoneId.systemDefault());

        Instant instant = Instant.parse("2022-02-15T18:35:24.00Z");
        String formattedInstant = formatter.format(instant);

        assertThat(formattedInstant).isEqualTo("15.02.2022");
    }
    ...
}

上記のように、 withZone()メソッドを使用してタイムゾーンを指定できます。

タイムゾーンの指定に失敗すると、UnsupportedTemporalTypeExceptionが発生することに注意してください。

@Test(expected = UnsupportedTemporalTypeException.class)
public void givenInstant_whenNotSpecifyingTimeZone_thenThrowException() {
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern(PATTERN_FORMAT);

    Instant instant = Instant.now();
    formatter.format(instant);
}

2.2. toString()メソッドの使用

別の解決策は、 toString()メソッドを使用して、Instantオブジェクトの文字列表現を取得することです。

テストケースを使用したtoString()メソッドの使用例を見てみましょう。

@Test
public void givenInstant_whenUsingToString_thenFormat() {
    Instant instant = Instant.ofEpochMilli(1641828224000L);
    String formattedInstant = instant.toString();

    assertThat(formattedInstant).isEqualTo("2022-01-10T15:23:44Z");
}

このアプローチの制限は、カスタムの人間に優しいフォーマットを使用してインスタントを表示できないことです。

3. 城田タイムライブラリー

または、 Joda-TimeAPIを使用して同じ目的を達成することもできます。 このライブラリは、Javaで日付と時刻を操作するためのすぐに使用できるクラスとインターフェイスのセットを提供します。

これらのクラスの中に、DateTimeFormatクラスがあります。 名前が示すように、このクラスは、文字列との間で日付/時刻データをフォーマットまたは解析するために使用できます。

それでは、 DateTimeFormatter を使用してインスタントを文字列に変換する方法を説明しましょう:

@Test
public void givenInstant_whenUsingJodaTime_thenFormat() {
    org.joda.time.Instant instant = new org.joda.time.Instant("2022-03-20T10:11:12");
        
    String formattedInstant = DateTimeFormat.forPattern(PATTERN_FORMAT)
        .print(instant);

    assertThat(formattedInstant).isEqualTo("20.03.2022");
}

ご覧のとおり、 DateTimeFormatter は、フォーマットパターンを指定するための forPattern()と、 Instantオブジェクトをフォーマットするためのprint()を提供します。

4. 結論

要約すると、この記事では、Javaでインスタントを文字列にフォーマットする方法について詳しく説明しました。

その過程で、コアJavaメソッドを使用してこれを実現するためのいくつかの方法を検討しました。 次に、Joda-Timeライブラリを使用して同じことを実現する方法を説明しました。

いつものように、この記事で使用されているコードは、GitHubにあります。