Choice, is to save time.
Unix time
协调世界时(UTC)是世界上调节时钟和时间的主要时间标准,它与0度经线的平太阳时相差不超过1秒,并不遵守夏令时。
Unix time,或称POSIX时间是UNIX或类UNIX系统使用的时间表示方式:从UTC1970年1月1日0时0分0秒起至现在的总秒数,不考虑闰秒,有些系统使用32位整数存储,会有2038年问题。
Unix time 就是 UTC+0 时间的时间戳
Y2038
2038年问题是指在使用POSIX时间的32位计算机应用程序上,格林尼治时间2038年1月19日凌晨03:14:07(北京时间:2038年1月19日中午11:14:07)之后无法正常工作
Java
public static void main(String[] args) {
System.out.println("Y2038: " + Instant.ofEpochSecond(2147483647L));
System.out.println("Java max date: " + Instant.ofEpochMilli(Long.MAX_VALUE));
System.out.println("Java max date: " + new Date(Long.MAX_VALUE));
}
Y2038 问题:2038-01-19T03:14:07Z
Java 最大时间:+292278994-08-17T07:12:55.807Z
Java 最大时间:Sun Aug 17 15:12:55 CST 292278994 ##时区问题造成不同
Java 没有 Y2038 问题,即使是使用 Date
也没有
JavaScript
let maxDateNowValue = 8640000000000000;
console.log("js max date: " + new Date(maxDateNowValue).toISOString());
// Max value plus 1 millisecond
let plusOneMS = maxDateNowValue + 1;
console.log(new Date(plusOneMS).toString()); // Invalid Date
js max date: +275760-09-13T00:00:00.000Z
Invalid Date
JavaScript 也没有 Y2038 问题,但能表示的最大时间比 Java 小
JavaScript 最大时间依据 https://stackoverflow.com/que...
时间格式
public static void main(String[] args) {
Instant now = Instant.now();
System.out.println("Z : "+now.atZone(ZoneId.of("Z")));
System.out.println("UTC+0 : "+now.atZone(ZoneId.of("UTC+0")));
System.out.println("UTC+8 : "+now.atZone(ZoneId.of("UTC+8")));
System.out.println("GMT : "+now.atZone(ZoneId.of("GMT")));
System.out.println("GMT+8 : "+now.atZone(ZoneId.of("GMT+8")));
System.out.println("Asia/Shanghai : "+now.atZone(ZoneId.of("Asia/Shanghai")));
}
Z : 2022-06-18T08:35:46.326Z
UTC+0 : 2022-06-18T08:35:46.326Z[UTC]
UTC+8 : 2022-06-18T16:35:46.326+08:00[UTC+08:00]
GMT : 2022-06-18T08:35:46.326Z[GMT]
GMT+8 : 2022-06-18T16:35:46.326+08:00[GMT+08:00]
Asia/Shanghai : 2022-06-18T16:35:46.326+08:00[Asia/Shanghai]
上面是同一个时间的不同格式,T
用于分隔日期和事件,Z
和 +08:00
都是表示基于标准时间的偏移量,Z = UTC+0
\ +08:00 = UTC+08:00
,[UTC+08:00]
表示采用的标准和偏移量
协调世界时(UTC)是最接近格林威治标准时间(GMT)的几个替代时间系统之一。对于大多数用途来说,UTC时间被认为能与GMT时间互换,但GMT时间已不再被科学界所确定
实际使用中 GMT 也可以配合偏移量使用,可以理解为和 UTC 是相同的
UTC 相当于是按经度划分的时区,Asia/Shanghai 是按行政区域划分的时区
时区问题
时区问题的本质是,不同的服务运行在不同时区的服务器上,在相互传输时间数据时,没有正确的处理时区,可能是在发送数据时,也可能是在接收数据时,或者两种情况都有。
如下的数据,不同时区的服务都会认为是当地时区的时间,无从知晓原始数据的时区:
{
"message": "hello world",
"createTime": "2022-06-01 12:00:00"
}
在时间表达式中加入时区信息可以避免这样的误解
{
"message": "hello world",
"createTime": "2022-06-01T12:00:00Z"
}
更多时区问题请移步: Web开发中的时区问题