Java中 LocalDate 与 Epoch 之间的转换

x33g5p2x  于2022-09-24 转载在 Java  
字(4.9k)|赞(0)|评价(0)|浏览(503)

本文将提供在 Java LocalDate 和 epoch 之间转换的示例。Epoch是用作特定历法时代起源的时间瞬间。Epoch是测量时间的参考点。 LocalDate 的历元参考点是 1970-01-01,格式为 YYYY-MM-DD。当我们将诸如 2019-11-15 这样的 LocalDate 转换为Epoch天数时,结果将是从 1970-01-01 到 2019-11-15 的天数。同理,当我们将 18215 等Epoch天数转换为 LocalDate 时,将通过将 18215 天数与 1970-01-01 相加得到结果 LocalDate
1. 使用 LocalDate.toEpochDay() 找到将 LocalDate 转换为Epoch日的代码片段。

long numberOfDays = localDate.toEpochDay();

2. 使用 LocalDate.ofEpochDay() 找到将Epoch天数转换为 LocalDate 的代码片段。

LocalDate localDate = LocalDate.ofEpochDay(numberOfDays);

现在详细找到在 Java LocalDate 和 epoch 之间转换的示例。

1. LocalDate 转换为 Epoch

LocalDate 转换为Epoch天数是从 1970-01-01 到给定本地日期的天数计算。将 LocalDate 转换为Epoch秒或毫秒是从 1970-01-01T00:00:00Z 开始到给定本地日期的时间计算。
LocalDateToEpoch.java

package com.concretepage;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
public class LocalDateToEpoch {
  public static void main(String[] args) {
	//Epoch reference of date is 1970-01-01
	LocalDate localDate = LocalDate.parse("2019-11-15");
	
	//LocalDate to epoch days
	long numberOfDays = localDate.toEpochDay();
	System.out.println(numberOfDays);
	
	//LocalDate to epoch seconds	
	long timeInSeconds = localDate.toEpochSecond(LocalTime.NOON, ZoneOffset.MIN);
	System.out.println(timeInSeconds);
	
	//LocalDate to epoch milliseconds 	
	Instant instant = localDate.atStartOfDay(ZoneId.systemDefault()).toInstant();	
	long timeInMillis = instant.toEpochMilli();
	System.out.println(timeInMillis);
	
	instant = localDate.atTime(LocalTime.MIDNIGHT).atZone(ZoneId.systemDefault()).toInstant();
	timeInMillis = instant.toEpochMilli();
	System.out.println(timeInMillis);	
  }
}

输出

18215
1573884000
1573756200000
1573756200000

1.1 LocalDate 转换为Epoch 天

LocalDate 提供 toEpochDay() 方法将本地日期转换为Epoch日。找到 Java 文档。

long toEpochDay()

toEpochDay() 将此日期转换为Epoch日。 toEpochDay() 计算从 1970-01-01 到给定本地日期的天数。如果给定的本地日期是 1970-01-01,则Epoch天数将为 0。

LocalDate localDate = LocalDate.parse("2019-11-15"); 
long numberOfDays = localDate.toEpochDay();

1.2 LocalDate 转换为 Epoch 秒

在 Java 9 中,LocalDate 提供了 toEpochSecond() 方法来将本地日期转换为Epoch秒。找到 Java 文档。

long toEpochSecond(LocalTime time, ZoneOffset offset)

toEpochSecond() 将此 LocalDate 转换为自Epoch 1970-01-01T00:00:00Z 以来的秒数。 LocalDate 与给定的时间和区域偏移相结合,以计算从 1970-01-01T00:00:00Z 开始的秒数。

long timeInSeconds = localDate.toEpochSecond(LocalTime.NOON, ZoneOffset.MIN);

1.3 LocalDate 转化为 Epoch 毫秒

要将 LocalDate 转换为Epoch毫秒,我们可以使用 Instant.toEpochMilli() 将此时刻转换为Epoch 1970-01-01T00:00:00Z 的毫秒数。要获得Epoch毫秒,首先我们将 LocalDate 转换为 Instant,然后使用其 toEpochMilli() 方法。

Instant instant = localDate.atStartOfDay(ZoneId.systemDefault()).toInstant();	
long timeInMillis = instant.toEpochMilli();

instant = localDate.atTime(LocalTime.MIDNIGHT).atZone(ZoneId.systemDefault()).toInstant();
timeInMillis = instant.toEpochMilli();

2. Epoch 转换为 LocalDate

通过将给定时间添加到 1970-01-01T00:00:00Z,将给定的Epoch天数、Epoch秒数或Epoch毫秒数转换为 LocalDate。找到代码。
EpochToLocalDate.java

package com.concretepage;
import java.sql.Timestamp;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
public class EpochToLocalDate {
  public static void main(String[] args) {	
	//Epoch reference of date is 1970-01-01
	long numberOfDays = 18215;
	LocalDate localDate = LocalDate.ofEpochDay(numberOfDays);
	System.out.println(localDate);
	
	//Using Instant
	long timeInSeconds = 1567109422L;
	localDate = LocalDate.ofInstant(Instant.ofEpochSecond(timeInSeconds), ZoneId.systemDefault());	
	System.out.println(localDate);
	
	LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochSecond(timeInSeconds), ZoneId.systemDefault());	
	localDate = localDateTime.toLocalDate();
	System.out.println(localDate);	
	
	long timeInMillis = 1567109422123L;
	localDate = LocalDate.ofInstant(Instant.ofEpochMilli(timeInMillis), ZoneId.systemDefault());	
	System.out.println(localDate);	
	
	//Using Timestamp
	localDate = new Timestamp(timeInMillis).toLocalDateTime().toLocalDate();
	System.out.println(localDate);
  }
}

输出

2019-11-15
2019-08-30
2019-08-30
2019-08-30
2019-08-30

2.1 使用 LocalDate.ofEpochDay()将Epoch 转换为 LocalDate

LocalDate.ofEpochDay() 通过将天数添加到 1970-01-01 来获得 LocalDate 的实例。找到 Java 文档。

static LocalDate ofEpochDay(long epochDay)

找到代码片段。

LocalDate localDate = LocalDate.ofEpochDay(numberOfDays);

2.2 使用 Instant将Epoch 转换为 LocalDate

Java 9 LocalDate.ofInstant() 接受 Instant 和区域 id 并返回 LocalDate 对象。找到 Java 文档。

static LocalDate ofInstant(Instant instant, ZoneId zone)

Instant 提供了以下方法来处理 epoch。
1. 以下方法使用 1970-01-01T00:00:00Z Epoch的秒数​​获取 Instant 的实例。

static Instant ofEpochSecond(long epochSecond)

找到代码片段。

localDate = LocalDate.ofInstant(Instant.ofEpochSecond(timeInSeconds), ZoneId.systemDefault());

2. 以下方法使用 1970-01-01T00:00:00Z Epoch的毫秒数获取 Instant 的实例。

static Instant ofEpochMilli(long epochMilli)

找到代码片段。

localDate = LocalDate.ofInstant(Instant.ofEpochMilli(timeInMillis), ZoneId.systemDefault());

2.3 使用 LocalDateTime 将 Epoch 转换为 LocalDate

我们可以使用 LocalDateTime.toLocalDate() 方法将 LocalDateTime 转换为 LocalDate

LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochSecond(timeInSeconds), ZoneId.systemDefault());	
localDate = localDateTime.toLocalDate();

2.4 使用Timestamp将 Epoch 转换为 LocalDate

找到 java.sql.Timestamp 构造函数。

public Timestamp(long time)

这将使用自 1970-01-01T00:00:00Z 以来的毫秒时间值构造一个 Timestamp 对象。
找到代码片段。

localDate = new Timestamp(timeInMillis).toLocalDateTime().toLocalDate();

相关文章