1. 引言

在Java中处理时间戳是一项常见的任务,它使我们能够更有效地操作和展示日期和时间信息,特别是在处理数据库或外部API时。

在这篇教程中,我们将探讨如何将一个Long类型的时间戳转换为LocalDateTime对象。

2. 理解Long时间戳和LocalDateTime

2.1. Long时间戳

Long时间戳表示自1970年1月1日以来经过的毫秒数的特定时间点。具体来说,它是一个单一值,指示自纪元以来流逝的时间。

此外,在这种格式下处理时间戳对于计算是高效的,但在用户交互或显示目的时需要转换为可读的日期时间格式。

例如,Long值1700010123000L表示参考点2023-11-15 01:02:03。

2.2. LocalDateTime

java.time包在Java 8中引入,提供了现代的日期和时间API。LocalDateTime是该包中的一个类,可以存储和操作不同时区的数据和时间。

3. 使用Instant

Instant类表示一个时间点,并且可以轻松转换为其他日期和时间表示形式。因此,要将Long时间戳转换为LocalDateTime对象,我们可以使用Instant类,如下所示:

long timestampInMillis = 1700010123000L;
String expectedTimestampString = "2023-11-15 01:02:03";

@Test
void givenTimestamp_whenConvertingToLocalDateTime_thenConvertSuccessfully() {
    Instant instant = Instant.ofEpochMilli(timestampInMillis);
    LocalDateTime localDateTime =
      LocalDateTime.ofInstant(instant, ZoneId.of("UTC"));

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    String formattedDateTime = localDateTime.format(formatter);

    assertEquals(expectedTimestampString, formattedDateTime);
}

在上述测试方法中,我们初始化一个名为timestampInMillisLong变量为1700010123000L。此外,我们使用Instant.ofEpochMilli(timestampInMillis)方法将Long时间戳转换为Instant

接着,LocalDateTime.ofInstant(instant, ZoneId.of("UTC"))方法使用UTC时区将Instant转换为LocalDateTime

4. 使用Joda-Time

Joda-Time是Java中流行的日期和时间处理库,提供了一个与标准Java日期和时间API具有更直观接口的替代方案。

让我们探索如何使用Joda-Time将long时间戳转换为格式化的LocalDateTime字符串:

@Test
void givenJodaTime_whenGettingTimestamp_thenConvertToLong() {
    DateTime dateTime = new DateTime(timestampInMillis, DateTimeZone.UTC);
    org.joda.time.LocalDateTime localDateTime = dateTime.toLocalDateTime();

    org.joda.time.format.DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
    String actualTimestamp = formatter.print(localDateTime);

    assertEquals(expectedTimestampString, actualTimestamp);
}

在这里,我们根据提供的long值实例化DateTime对象。此外,DateTimeZone.UTC方法明确地为DateTime对象定义了时区为协调世界时间(UTC)。然后,toLocalDateTime()函数无缝地将DateTime对象转换为LocalDateTime对象,保持了时间无关的表示。

最后,我们使用名为formatterDateTimeFormatterLocalDateTime对象转换为字符串,遵循指定的模式。

5. 总结

总之,将Long时间戳转换为LocalDateTime对象的Java过程涉及利用Instant类精确表示时间。这使得有效管理日期和时间信息成为可能,确保与数据库或外部API的无缝交互。

如往常一样,本文的完整代码示例可以在GitHub上找到:这里