概述

时间是物理学中的七个基本物理量之一,指的是事件过程长短和发生顺序的度量,是物质运动和能量的传递。

要深入的理解时间这个概念,就不得不从以下几个方面进行展开:

  • 时区
  • UTC时间
  • Unix时间戳
  • 本地时间
  • 夏令时、冬令时
  • 常见国家相关的时间知识

时区

时区是地球上的区域使用同一个时间定义。由于太阳从东边升起、从西边落下,所以居住在不同地区的人们看到的日出、日落时间必定有所偏差(居住东边的人比西边的人先看到日出),而这些偏差就是所谓的时差。

为了克服时间上的混乱,1884年在华盛顿召开的国际子午线会议上,规定将全球划分为24个时区,以英国为中时区(零时区),每个时区横跨经度15度差值为1个小时(向西减1小时,向东加1小时)。

UTC时间

UTC时间,又称协调世界时、世界统一时间、世界标准时间。它是以原子钟为基础进行计算,和GMT(格林威治时间)一样都是时间的参照物。UTC与GMT的联系与区别在于:GMT是老的时间计量标准,是根据地球自转来计算时间的,因此准确度不够。而后来随着科学技术的演进与发展,原子钟的实现将时间的准确度达到2000万年才误差1秒,故以它为基础进行计算的时间称之为UTC时间。

Unix时间戳

Unix时间戳是在计算机领域延伸出来的一种概念。是以UTC时间的1970年01月01日00时00分00秒为起始值进行计算,得到的总秒数就是Unix时间戳。也就是说从理论上讲Unix时间戳在全球中值是一样的(但由于不同电脑硬件出厂时的设定不同,可能出现几秒的误差)。

在PHP中,可以直接使用time函数获取Unix时间戳:

echo time();

本地时间

本地时间是指所在地目前的时间,因此它与所在地的时区有关系。如中国上海位于东八区,那么上海的本地时间应该是UTC时间 + 8个小时。

PHP示例代码:

# UTC时间
date_default_timezone_set('UTC');
echo date('Y-m-d H:i:s') . PHP_EOL;

# GMT时间
echo gmdate('Y-m-d H:i:s') . PHP_EOL;

# 上海时间
date_default_timezone_set('Asia/shanghai');
echo date('Y-m-d H:i:s') . PHP_EOL;

从上面可以看出由于上海位于东八区,因此与UTC时间相差8个小时。

夏令时、冬令时

夏令时、冬令时是一种为节约能源而人为规定地方时间的制度,在这一制度实行期间使用统一时间。那为什么要引入这两个制度呢?原因在于夏天天亮的早,而在冬天天亮的晚,因此有些国家为了充分利用光照资源,从而达到节约照明用电的目的,施行夏令时、冬令时制度(就和上学时调整上课时间差不多)。

所以当该地区施行夏令时时,会将时间调快一个小时,而进行冬令时时再把时间调回来。

常见国家相关的时间知识

下面将以常见国家为基础,对该国家时区、时区代码、夏令时等方面做个总结:

国家国家代码城市时区时区代码夏令时
美国US洛杉矶西八区America/Los_Angeles三月第二个星期日2:00始 十一月第一个星期日2:00止
加拿大CA温哥华西八区America/Vancouver三月第二个星期日2:00始 十一月第一个星期日2:00止
墨西哥MX墨西哥城西六区America/Mexico_City五月第一个星期日2:00始 九月最后一个星期日2:00止
英国UK伦敦零时区Europe/London三月最后一个星期日1:00始 十月最后一个星期日2:00止
德国DE柏林东一区Europe/Berlin三月最后一个星期日2:00始 十月最后一个星期日3:00止
法国FR巴黎东一区Europe/Paris三月最后一个星期日2:00始 十月最后一个星期日3:00止
意大利IT罗马东一区Europe/Rome三月最后一个星期日2:00始 十月最后一个星期日3:00止
西班牙ES马德里东一区Europe/Madrid三月最后一个星期日2:00始 十月最后一个星期日3:00止
日本JP东京东九区Asia/Tokyo未施行
印度IN加尔各答东五区Asia/Kolkata未施行

拓展

PHP获取指定时区相对零时区的偏移量,如果该国家施行夏令时,则自动处理,代码如下:

$dateTime = new \DateTime('now', new \DateTimeZone('Asia/shanghai'));
echo $dateTime->getOffset(); // 输出28800,即相差8小时,因为上海位于东八区