时区

时区定义为地球上一个区域使用的同一个时间, 用于统一一定区域内的计时标准. 但不同时区之间还是存在时间的换算问题.

时间戳

格林尼治标准时间 (Greenwich Mean Time) 与 GMT 时间戳

格林尼治标准时间是指格林尼治天文台测定的时间. 时间值由天文观测得到. 随着技术进步, 其值已经变得越来越精确. 具体的计算原则不再赘述.

GMT 时间戳表示的是格林尼治标准时间 1970 年 01 月 01 日 00 时 00 分 00 秒, 即 01/01/1970 01:01 GMT 到当前时间的总秒数. 作为所有时间计算的参照.

国际标准时间 (Universal Time Coordinated) 与 UTC 时间戳

在 1967 年国际度量衡大会把秒的定义改成铯原子固定震荡次数时间后, 标准时间值就与地球自转脱钩了. 根据原子钟计算的时间值作为标准时间. 同时根据该时间计算得出的时间戳即 UTC 时间戳.

大部分时间 UTC 时间与 GMT 时间完全一致. 但 UTC 时间比 GMT 时间更加精确, 因此被作为所有电子设备的时间标准.

UTC 时间存在闰秒问题

由于 GMT 时间是根据观测得出的, 而地球自转正在缓慢减速, 因此 GMT 时间的一秒正在变得越来越长. 而 UTC 时间是绝对精确的. 导致 GMT 时间和 UTC 时间每隔一段时间 (若干年) 会出现超过 1 秒的差异. 又因为 GMT 时间更加符合人们的直观感受, 所以国际地球自转服务 (International Earth Rotation and Reference Systems Service) 决定, UTC 加入闰秒计算, 即每隔若干年, 将 UTC 时间减慢一秒 (最近的一次是 2015 年 6 月 30 日, 出现了 06/30/2015 23:59:60 UTC 的时间值) , 以维持与 GMT 时间一致.

Unix 时间戳

GMT 时间戳和 UTC 时间戳都只是时间概念. 而 Unix 时间戳就是根据该二概念, 将 GMT/UTC 时间戳的计算结果反映在计算机中. Linux 系统和应用中获取的时间戳指的就是 Unix 时间戳.

Unix 时间戳存在精度问题, 不同计算机间的时间戳可能存在若干秒的差异.

Linux 中时间值的获取和设置

datem命令查看系统时间, 包括时间和时区.

date命令的更多用法可以用man命令查看.

Linux 系统时间的闰秒处理: Linux 在默认情况下不会自动修正闰秒. 在闰秒发生后, 系统时间与权威时间将有 1 秒钟的差异. 当然, 可以通过 NTP 或 PTP 等时间同步服务与权威的时间发布机构同步时间, 或者升级 tzdata 软件包等方式解决单台服务器的闰秒问题.

PHP 中时间值的获取

  • time() PHP 中, 用time()可以获取当前电脑上的 Unix 时间戳.时间戳不存在时区问题.
  • microtime() PHP 中, 用microtime()可以获取当前电脑上的 Unix 时间毫秒数.
  • date() PHP 中, 用date()可以获取当前电脑设置的时区 (默认是 UTC) 对应的时间.
  • DateTime()PHP 中, 也可以通过new DateTime()的方式获取当前时间, 因为新实例化的DateTime()对象默认的时间戳是当前时间. 用DateTime()获取时间还有一个好处, 就是可以setTimezone()方法方便地在时区间切换.

分类: 后端

发表评论

电子邮件地址不会被公开。 必填项已用*标注