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上找到。