Java中将长整型转换为日期

在 Java 中处理日期时,我们经常会看到以长整型值表示的日期/时间值,表示自纪元1970 年 1 月 1 日 00:00:00 GMT以来的天数、秒数或毫秒数。

在这个简短的教程中,我们将探索在 Java 中将长值转换为日期的不同方法。首先,我们将解释如何使用核心 JDK 类来执行此操作。然后,我们将展示如何使用第三方 Joda-Time 库实现相同的目标。

1、使用 Instant类
Java 8 因其为 Java 领域带来的新 Date-Time API 功能而经常受到赞扬。引入此 API 主要是为了弥补旧版 API 的缺点。

最简单的解决方案是使用新的 Java 8 日期时间 API中引入的Instant类。此类描述时间轴上的单个瞬时点。

那么,让我们在实践中看看:

@Test
void givenLongValue_whenUsingInstantClass_thenConvert() {
    Instant expectedDate = Instant.parse("2020-09-08T12:16:40Z");
    long seconds = 1599567400L;
    Instant date = Instant.ofEpochSecond(seconds);
    assertEquals(expectedDate, date);
}

如上所示,我们使用ofEpochSecond()方法创建了Instant类的对象。请记住,我们也可以使用ofEpochMilli()方法来创建使用毫秒的Instant实例。

2.使用LocalDate类
LocalDate是将长值转换为日期时要考虑的另一个选项此类对经典日期进行建模,例如 2023-10-17,没有时间详细信息。

通常,我们可以使用LocalDate#ofEpochDay方法来实现我们的目标:

@Test
void givenLongValue_whenUsingLocalDateClass_thenConvert() {
    LocalDate expectedDate = LocalDate.of(2023, 10, 17);
    long epochDay = 19647L;
    LocalDate date = LocalDate.ofEpochDay(epochDay);
    assertEquals(expectedDate, date);
}

ofEpochDay ()方法从给定纪元日创建LocalDate类的实例。

3.使用 日期 类
Date类表示具有毫秒精度的特定时刻。顾名思义,它附带了许多我们可以用来操作日期的方法。它提供了将long值转换为日期的最简单方法,因为它提供了接受long类型参数的重载构造函数。

那么,让我们看看它的实际效果:

@Test
void givenLongValue_whenUsingDateClass_thenConvert() {
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    dateFormat.setTimeZone(TimeZone.getTimeZone(
"UTC"));
    Date expectedDate = dateFormat.parse(
"2023-10-15 22:00:00");
    long milliseconds = 1689458400000L;
    Date date = new Date(milliseconds);
    assertEquals(expectedDate, date);
}

请注意,Date类已经过时,属于旧 API。因此,这不是处理日期的最佳方法。

4.使用日历类
另一种解决方案是使用旧日期 API 中的Calendar类。此类提供了setTimeInMillis(long value)方法,我们可以使用该方法将时间设置为给定的long值。

现在,让我们使用另一个测试用例来举例说明此方法的使用:

@Test
void givenLongValue_whenUsingCalendarClass_thenConvert() {
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    dateFormat.setTimeZone(TimeZone.getTimeZone(
"UTC"));
    Date expectedDate = dateFormat.parse(
"2023-07-15 22:00:00");
    long milliseconds = 1689458400000L;
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeZone(TimeZone.getTimeZone(
"UTC"));
    calendar.setTimeInMillis(milliseconds);
    assertEquals(expectedDate, calendar.getTime());
}

同样,指定的long值表示自纪元以来经过的毫秒数。

5.使用 Joda-Time
最后,我们可以使用Joda-Time 库来应对我们的挑战。首先,我们将其依赖项添加到pom.xml文件中:

<dependency>
    <groupId>joda-time</groupId>
    <artifactId>joda-time</artifactId>
    <version>2.12.5</version>
</dependency>

同样,Joda-Time 提供了它的LocalDate类版本。那么,让我们看看如何使用它将long值转换为LocalDate对象:

@Test
void givenLongValue_whenUsingJodaTimeLocalDateClass_thenConvert() {
    org.joda.time.LocalDate expectedDate = new org.joda.time.LocalDate(2023, 7, 15);
    long milliseconds = 1689458400000L;
    org.joda.time.LocalDate date = new org.joda.time.LocalDate(milliseconds, DateTimeZone.UTC);
    assertEquals(expectedDate, date);
}

如图所示,LocalDate提供了一种从长值构造日期的直接方法。

结论
在这篇短文中,我们详细解释了如何在 Java 中将long值转换为日期。
首先,我们了解了如何使用内置 JDK 类进行转换。然后,我们说明了如何使用 Joda-Time 库来实现相同的目标。