Java LocalDate 和 Epoch 互相转换
此页面将提供在Java LocalDate
和Epoch
之间转换的示例。
Epoch
是用作特定日历时代起源的时间瞬间。
Epoch
是测量时间的参考点。
LocalDate
的纪元参考点是1970-01-01
,格式为YYY-MM-DD
。
当我们把一个LocalDate
如2019-11-15
转换成纪元日时,那么结果将是1970-01-01
到2019-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 LocalDate
和Epoch
之间转换的示例。
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()
接受Instant
和zone 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