• 时间戳的理解


    背景

    最近需求涉及到不同时区的时间展示,发现自己对于时间戳的理解存在误差。

    定义

    Unix 时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。
    UNIX时间戳的 0 按照 ISO 8601 规范为 :1970-01-01T00:00:00Z.

    解释

    简单来说,时间戳是当前时间距离 1970-01-01T00:00:00Z 有多少秒。
    比如,当前时间为 2022年7月6日10点32分50秒,故这个时间点对应的时间戳为 1657074770

    2022年7月6日10点32分50秒 - 1970年1月1日0点0分0秒 = 1657074770 (秒)

    这里忽略了两个东西,1970-01-01T00:00:00Z 中,字母T和字母Z是什么含义呢?

    日期和时间的表示方法

    根据 ISO 8601中规定:

    1、对UTC时间最后加一个大写字母Z

    例如:UTC时间下午2点30分5秒表示为14:30:05Z

    2、日期和时间的合并表示时,要在时间前面加一大写字母T

    例如:北京时间2004年5月3日下午5点30分8秒,可以写成2004-05-03T17:30:08+08:00

    所以,字母T是一种固定的表示方式,可以忽略;而UTC时间是什么意思呢?

    UTC

    UTC为世界标准时间;人为划定一个区域的时间为标准时间。

    例如:北京时间 2004-05-03T17:30:08+08:00,其中的+08:00为+8小时,就是相对与标准时间再+8小时

    在中国的时间戳

    回到时间戳的定义上,时间戳定义为两个时间点的秒数差,那么两个时间点的 时区一致 才能做减法,例如:

    在国内获取的当前时间为 2022-07-06 11:19:31,更标准的表示为 2022-07-06T11:19:31 +08:00
    在国内计算时间戳时的时间起点为 1970-01-01T00:00:00 +08:00
    时间戳 = 2022-07-06T11:19:31 +08:00 - 1970-01-01T00:00:00 +08:00
    而不是 2022-07-06T11:19:31 +08:00 - 1970-01-01T00:00:00Z

    总结

    • 时间戳是 绝对的,同一时间点上,在世界上任何国家计算出的时间戳均是同一个值
    • 时间是包含时区的,相同时区 的时间才能做减法

    延伸

    • 存储中使用时间戳的优势之一是可以在代码中动态的格式化为不同国家(时区)的时间,不受外部环境(如db)的影响

    参考资料

    unix时间戳定义
    ISO 8601
    UTC

  • 相关阅读:
    链路追踪标准
    c++ 卡特兰数
    Git-cherry pick的使用
    1.7-34:回文子串
    【深入浅出Spring6】第七期——使用JDBC模板与代理模式
    Hover.css动画库的使用
    第十一章 配置数据库(三)
    Linux 关闭防火墙
    文本生成解码策略
    ICSFUZZ:操纵I/O、二进制代码重用以及插桩,来Fuzzing工业控制应用程序
  • 原文地址:https://blog.csdn.net/snowin1994/article/details/125634183