1. 概述

在这个教程中,我们将学习如何在Java中将瞬时(Instant)格式化为字符串。

首先,我们来了解一下Java中的瞬时是什么。然后,我们将展示如何使用核心Java和第三方库(如Joda-Time)来解答我们的核心问题。

2. 使用核心Java格式化瞬时

根据Java文档,瞬时是自1970年1月1日UTC时间00:00:00以来的测量时间戳。

Java 8引入了一个方便的类Instant,用于表示时间线上的特定瞬间。通常,我们可以使用这个类在应用程序中记录事件的时间戳。

现在我们了解了Java中的瞬时,接下来让我们看看如何将其转换为String对象。

2.1. 使用DateTimeFormatter

一般来说,我们需要一个格式化器来格式化Instant对象。幸运的是,Java 8引入了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-Time库

另一种选择是使用Joda-Time API来达到同样的目标。这个库提供了一套现成的类和接口,用于在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()来指定格式化模式,并使用print()方法格式化Instant对象。

4. 总结

在这篇文章中,我们详细介绍了如何在Java中将瞬时格式化为字符串。

我们探讨了几种使用核心Java方法实现此目的的方法。然后解释了如何使用Joda-Time库来实现相同的目标。

如往常一样,本文中使用的代码可以在GitHub上找到。