Java LocalDateTime 和 Epoch 互相转换
本页将提供
Java LocalDateTime
和纪元(
epoch
)时间之间的转换实例。
一个纪元是一个瞬间的时间,用来作为特定日历时代的起源。
纪元(epoch
)是一个参考点,从它开始测量时间。
LocalDateTime
的纪元参考点是UTC
的1970-01-01T00:00:00Z
。
当我们把本地日期时间如2019-11-15T13:15:30
转换为纪元秒时,那么结果将是1970-01-01T00:00:00Z
到2019-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