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

本文详细介绍了如何在Java中将LocalDate转换为Epoch(纪元秒和纪元毫秒),以及如何将Epoch转换回LocalDate。通过使用LocalDate的toEpochDay(), toEpochSecond(), toEpochMilli()方法,以及Instant和Timestamp的相关方法,可以实现不同时间单位之间的转换。此外,还给出了具体的代码示例和输出结果。

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

此页面将提供在Java LocalDateEpoch之间转换的示例。

Epoch是用作特定日历时代起源的时间瞬间。

Epoch是测量时间的参考点。

LocalDate的纪元参考点是1970-01-01,格式为YYY-MM-DD

当我们把一个LocalDate2019-11-15转换成纪元日时,那么结果将是1970-01-012019-11-15的天数。

同样,当我们把18215这样的纪元日转换为LocalDate时,所得到的LocalDate将由1970-01-01加上18215天而得到。

1.找到使用LocalDate.toEpochDay()LocalDate转换为纪元日的代码片断。

long numberOfDays = localDate.toEpochDay(); 

找到使用LocalDate.ofEpochDay()将纪元日转换为LocalDate的代码片段。

LocalDate localDate = LocalDate.ofEpochDay(numberOfDays); 

现在详细介绍Java LocalDateEpoch之间转换的示例。

1. LocalDate 转 Epoch

LocalDate转换为纪元天数是指从1970-01-01起至给定的当地日期的天数计算。

LocalDate转换成秒或毫秒是指从1970-01-01T00:00:00Z开始到给定的当地日期的时间计算。

LocalDateToEpoch.java

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 转纪元日
LocalDate提供toEpochDay()方法,将本地日期转换为纪元日。

查找Java文档。

long toEpochDay() 

toEpochDay()将此日期转换为纪元日。

toEpochDay()计算从1970-01-01开始到给定的本地日期的天数。

如果给定的本地日期是1970-01-01,那么纪元日的数量将是0

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

1.2 LocalDate 转纪元秒

Java 9中,LocalDate提供了toEpochSecond()方法来将本地日期转换为纪元秒。

查找Java文档。

long toEpochSecond(LocalTime time, ZoneOffset offset) 

toEpochSecond()将此LocalDate转换为自1970-01-01T00:00:00Z纪元以来的秒数。

LocalDate与给定的时间和区域偏移相结合,计算从1970-01-01T00:00:00Z开始的秒数。

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

1.3 LocalDate 转纪元毫秒

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

要想得到纪元毫秒,首先我们要把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转换为LocalDate

查找代码。

EpochToLocalDate.java

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() 接受Instantzone id并返回LocalDate对象。
查找Java文档。

static LocalDate ofInstant(Instant instant, ZoneId zone) 

Instant提供了以下的方法来处理Epoch

1. 下面的方法是用1970-01-01T00:00:00Z的秒数来获得一个Instant的实例。

static Instant ofEpochSecond(long epochSecond) 

代码片段。

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

2. 下面的方法从1970-01-01T00:00:00Z的纪元中用毫秒获得一个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(); 

参考文献

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

猫巳

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

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

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

打赏作者

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

抵扣说明:

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

余额充值