概述
时间是物理学中的七个基本物理量之一,指的是事件过程长短和发生顺序的度量,是物质运动和能量的传递。
要深入的理解时间这个概念,就不得不从以下几个方面进行展开:
- 时区
- 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小时,因为上海位于东八区