文章目录
1.时间戳定义
首先我们要先了解时间戳的定义,Unix时间戳(Unix timestamp),或称Unix时间(Unix time)、POSIX时间(POSIX time),是一种时间表示方式,定义为从格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。
即北京时间要比格林威治时间多8个小时
unix时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。[1]
Unix时间戳(英文为Unix epoch, Unix time, POSIX time 或 Unix timestamp)
是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。
UNIX时间戳的0按照ISO 8601规范为 :1970-01-01T00:00:00Z.
一个小时表示为UNIX时间戳格式为:3600秒;一天表示为UNIX时间戳为86400秒,闰秒不计算。
在大多数的UNIX系统中UNIX时间戳存储为32位,这样会引发2038年问题或Y2038。
2.Instant定义
Instant表示的永远是0时区的时间线。
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime);
System.out.println("############################");
Instant now = Instant.now();
System.out.println(now + "####" + now.toEpochMilli());
打印结果:
2021-07-29T11:26:24.983
############################
2021-07-29T03:26:25.001Z####1627529185001
所以用Instant.toEpochMilli()算出来的时间戳,永远都是当前时间-0时区1970年00:00:00
3.理解:
3.1 localDateTime.toInstant(ZoneOffset.of(“+8”)).toEpochMilli()到底怎么来理解?
1.localDateTime.toInstant(ZoneOffset.of(“+8”))先将localDateTime转换成0时区时间,而ZoneOffset表示偏移量,在这里表示localDateTime比0时区偏移了+8个小时,所以localDateTime转换成0时区的时候,就是A(0时区时间)= B(localDateTime)-8小时
2.toEpochMilli()再将得到的0时区时间转换成时间戳,即A(0时区时间)-0时区1970年00:00:00 = 0时区时间戳
4.测试:
public static void main(String[] args) {
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime);
System.out.println(localDateTime.toInstant(ZoneOffset.of("-8")) + "####" + localDateTime.toInstant(ZoneOffset.of("-8")).toEpochMilli());
System.out.println(localDateTime.toInstant(ZoneOffset.of("+0")) + "####" + localDateTime.toInstant(ZoneOffset.of("+0")).toEpochMilli());
System.out.println(localDateTime.toInstant(ZoneOffset.of("+8")) + "####" + localDateTime.toInstant(ZoneOffset.of("+8")).toEpochMilli());
}
打印:
2021-07-29T12:10:19.685
2021-07-29T20:10:19.685Z####1627589419685
2021-07-29T12:10:19.685Z####1627560619685
2021-07-29T04:10:19.685Z####1627531819685