Java中 LocalDateTime 与 Epoch 之间的转换

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

本文将提供在 Java LocalDateTime 和Epoch之间转换的示例。Epoch是用作特定历法时代起源的时间瞬间。Epoch是测量时间的参考点。 LocalDateTime 的Epoch参考点是 UTC 中的 1970-01-01T00:00:00Z。当我们将本地日期时间(例如 2019-11-15T13:15:30)转换为纪元秒时,结果将是从 1970-01-01T00:00:00Z 到 2019-11-15T13:15 的时间间隔(以秒为单位) :30。同样,当我们将 epoch 秒数(例如 1567109422)转换为 LocalDateTime 时,将通过将 1567109422 秒数与 1970-01-01T00:00:00Z 相加得到结果 LocalDateTime
1. 找到使用 LocalDateTime.toEpochSecond()LocalDateTime 转换为Epoch的代码片段。

long timeInSeconds = localDateTime.toEpochSecond(ZoneOffset.UTC);

2. 找到使用 LocalDateTime.ofEpochSecond() 将Epoch转换为 LocalDateTime 的代码片段。

LocalDateTime localDateTime = LocalDateTime.ofEpochSecond(timeInSeconds, 0, ZoneOffset.UTC);

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

1. LocalDateTime 转换为 Epoch

LocalDateTime 转换为Epoch秒或毫秒是从 1970-01-01T00:00:00Z 开始到给定本地日期时间的时间计算。如下代码。
LocalDateTimeToEpoch.java

package com.concretepage;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
public class LocalDateTimeToEpoch {
  public static void main(String[] args) {
	//1970-01-01T00:00:00Z
	LocalDateTime localDateTime = LocalDateTime.parse("2019-11-15T13:15:30");
	
	//LocalDateTime to epoch seconds
	long timeInSeconds = localDateTime.toEpochSecond(ZoneOffset.UTC);
	System.out.println(timeInSeconds);
	
	//LocalDateTime to epoch milliseconds 	
	Instant instant = localDateTime.atZone(ZoneId.systemDefault()).toInstant();	
	long timeInMillis = instant.toEpochMilli();
	System.out.println(timeInMillis);
  }
}

输出

1573823730
1573803930000

1.1 LocalDateTime 转换为Epoch秒

LocalDateTime 提供 toEpochSecond() 方法将本地日期时间转换为Epoch秒。

long toEpochSecond(ZoneOffset offset)

toEpochSecond() 结合这个本地日期时间和指定的偏移量来计算Epoch秒值。 toEpochSecond() 计算从 1970-01-01T00:00:00Z 到给定本地日期时间的秒数。

long timeInSeconds = localDateTime.toEpochSecond(ZoneOffset.UTC);

1.2 LocalDateTime转换为Epoch毫秒

要将 LocalDateTime 转换为Epoch毫秒,我们可以使用 Instant.toEpochMilli() 将这一时刻转换为从 1970-01-01T00:00:00Z Epoch开始的毫秒数。为了获得Epoch毫秒,首先我们将 LocalDateTime 转换为 Instant,然后使用它的 toEpochMilli() 方法。

Instant instant = localDateTime.atZone(ZoneId.systemDefault()).toInstant();	
long timeInMillis = instant.toEpochMilli();

2. Epoch 转换为 LocalDateTime

通过将给定时间添加到 1970-01-01T00:00:00Z 将给定的Epoch秒或毫秒转换为 LocalDateTime。如下代码。
EpochToLocalDateTime.java

package com.concretepage;
import java.sql.Timestamp;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
public class EpochToLocalDateTime {
  public static void main(String[] args) {
	//Epoch point of time is 1970-01-01T00:00:00Z
	long timeInSeconds = 1567109422L;
	
	//Using LocalDateTime.ofEpochSecond
	LocalDateTime localDateTime = LocalDateTime.ofEpochSecond(timeInSeconds, 0, ZoneOffset.UTC);
	System.out.println(localDateTime);
	
	//Using Instant
	localDateTime = LocalDateTime.ofInstant(Instant.ofEpochSecond(timeInSeconds), ZoneId.systemDefault());	
	System.out.println(localDateTime);
	
	localDateTime = LocalDateTime.ofInstant(Instant.ofEpochSecond(timeInSeconds, 0), ZoneId.systemDefault());	
	System.out.println(localDateTime);	
	
	long timeInMillis = 1567109422123L;
	localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(timeInMillis), ZoneId.systemDefault());	
	System.out.println(localDateTime);	
	
	//Using Timestamp
	localDateTime = new Timestamp(timeInMillis).toLocalDateTime();
	System.out.println(localDateTime);
  }
}

输出

2019-08-29T20:10:22
2019-08-30T01:40:22
2019-08-30T01:40:22
2019-08-30T01:40:22.123
2019-08-30T01:40:22.123

2.1 Epoch 转换为 LocalDateTime 使用 LocalDateTime.ofEpochSecond()

LocalDateTime.ofEpochSecond() 使用 1970-01-01T00:00:00Z Epoch的秒数​​获取 LocalDateTime 的实例。如下Java代码:

static LocalDateTime ofEpochSecond(long epochSecond, int nanoOfSecond, ZoneOffset offset)

如下代码片段

LocalDateTime localDateTime = LocalDateTime.ofEpochSecond(timeInSeconds, 0, ZoneOffset.UTC);

2.2 使用 Instant 将Epoch 转换为 LocalDateTime

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

static Instant ofEpochSecond(long epochSecond)

如下代码片段。

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

2. 此方法使用 1970-01-01T00:00:00Z Epoch的秒数​​和秒的纳秒小数部分获取 Instant 的实例。

static Instant ofEpochSecond(long epochSecond, long nanoAdjustment)

如下代码片段。

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

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

static Instant ofEpochMilli(long epochMilli)

如下代码片段。

localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(timeInMillis), ZoneId.systemDefault());

2.3 使用Timestamp将Epoch 转换为 LocalDateTime

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

public Timestamp(long time)

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

localDateTime = new Timestamp(timeInMillis).toLocalDateTime();

相关文章