【Java 8 新特性】Java LocalDateTime 和 Epoch 互相转换

本文详细介绍了Java中LocalDateTime与Epoch时间之间的转换方法,包括LocalDateTime转Epoch的秒和毫秒,以及Epoch转回LocalDateTime的多种方式,如使用LocalDateTime.ofEpochSecond(),Instant以及Timestamp等。示例代码清晰展示了转换过程,对于理解和操作Java日期时间非常有帮助。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


本页将提供 Java LocalDateTime和纪元( epoch)时间之间的转换实例。

一个纪元是一个瞬间的时间,用来作为特定日历时代的起源。

纪元(epoch)是一个参考点,从它开始测量时间。

LocalDateTime的纪元参考点是UTC1970-01-01T00:00:00Z

当我们把本地日期时间如2019-11-15T13:15:30转换为纪元秒时,那么结果将是1970-01-01T00:00:00Z2019-11-15T13:15:30的时间差距,单位为秒,这也是我们平时说的时间戳。

同样地,当我们把1567109422这样的纪元秒转换为LocalDateTime时,那么产生的LocalDateTime将由1970-01-01T00:00:00Z加上1567109422秒而得到。

1.找到使用LocalDateTime.toEpochSecond()LocalDateTime转换为纪元秒的代码片断。

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

2.找到使用LocalDateTime.ofEpochSecond()将纪元秒转换为LocalDateTime的代码片断。

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

现在找到在Java LocalDateTime和纪元时间之间转换的详细例子。

1. LocalDateTime 转 Epoch

LocalDateTime 转换为纪元秒或毫秒是从 1970-01-01T00:00:00Z 开始到给定本地日期时间的时间计算。

找到代码。

LocalDateTimeToEpoch.java

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 转纪元秒

LocalDateTime提供toEpochSecond()方法,将本地日期时间转换成纪元秒。

查找Java文档。

long toEpochSecond(ZoneOffset offset) 

toEpochSecond()将这个本地日期时间和指定的偏移量结合起来,计算出纪元秒值。

toEpochSecond()计算从1970-01-01T00:00:00Z开始到指定本地日期时间的秒数。

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

1.2 LocalDateTime 转纪元毫秒

要将LocalDateTime转换为纪元毫秒,我们可以使用Instant.toEpochMilli()将这个瞬间转换为从1970-01-01T00:00:00Z纪元开始的毫秒数。

要想得到纪元毫秒,首先我们要把LocalDateTime转换为Instant,然后使用它的toEpochMilli()方法。

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

2. Epoch 转 LocalDateTime

通过将给定的纪元秒或毫秒与1970-01-01T00:00:00Z相加转换为LocalDateTime

查找代码。

EpochToLocalDateTime.java

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 使用 LocalDateTime.ofEpochSecond() 将 Epoch 转换为 LocalDateTime

LocalDateTime.ofEpochSecond()使用1970-01-01T00:00:00Z这个纪元的秒数获得一个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提供了以下方法来处理纪元时间。

1.这个方法使用1970-01-01T00:00:00Z的纪元中的秒来获得一个Instant的实例。

static Instant ofEpochSecond(long epochSecond) 

查找代码段。

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

2.该方法使用1970-01-01T00:00:00Z和纳秒级的秒数来获得Instant的一个实例。

static Instant ofEpochSecond(long epochSecond, long nanoAdjustment) 

查找代码段。

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

3.这个方法从1970-01-01T00:00:00Z的纪元中获得一个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以来的毫秒时间值构建一个时间戳对象。

查找代码片段。

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

参考文献

【1】Class LocalDateTime
【2】Class Instant
【3】Convert between Java LocalDateTime and Epoch

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫巳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值