无论是在生活中还是在节目中,时间都是一个很重要的东西。 在程序中,时间可以让我们理清整个流程的脉络。 而在实际的项目实践中,时区设置不当往往会导致在显示或存储时间时出现一些高端问题,所以昨晚我们就来聊聊PHP时区问题。
时区定义
目前,国际时区划分范围分为24个时区。 每个时区都有自己的当地时间。 每个时区的当地时间同时相差1到23小时。 例如,美国纽约当地时间(该地区为格林威治标准时间)与上海当地时间相差8小时。
说到时区,就不得不提两个时间,一个是GMT,另一个是UTC。
GMT:格林威治标准时间(GMT)。 这个时间原本用来表示标准参考时间,现在被UTC取代。可以理解为某个地区的当地时间
UTC:新实施的国际标准参考时间(Universal Time Cooperatived,UTC)。 该时间作为标准时间,可以换算成其他时区(地区)的时间。 例如GMT=UTC+0(因为GMT所在时区为0),
PHP时区设置
了解了上面的概念之后,我们来看看如何在php中设置时区。 在设置之前,我们先了解一下PHP对于不同时区的定义。 具体参考符号在官方文档中:
PHP配置文件位于安装目录下的php.ini文件中。 如果是Linux,一般在安装目录的etc目录下。 在php.ini文件中找到date.timezone配置项。 具体信息如下:
[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
;date.timezone =
date.timezone注解后,如果在php中使用,则默认为GMT。 这里我们可以设置为PRC(中国时区)php 时间相加,或者设置为亚洲/上海。 这只是一个时区标识符,用来表明当前的php应该根据那种区域来处理时间。
但不推荐使用这些方法,因为在实际生产项目中,代码通常部署在多台机器上。 如果需要修改配置,需要运维朋友登录不同的机器进行修改并重启。 由于配置过程冗长,此过程很容易出现手动错误。 因此,在这些情况下,不建议在实际项目中使用。 虽然一旦发生服务中断,会给公司带来业务损失。
使用 ini_set() 函数设置时区
PHP中的ini_set($env,$value)函数可以用来在代码中设置具体的配置项值。 其中$env是要更改的配置项,$value表示配置项的值。 但该功能有一定的使用限制,并不是所有的配置项都可以使用该功能进行设置。 具体文档可以查看官方地址:
使用示例如下:
<?php
ini_set('date.timezone', 'GMT');
echo 'current timezone: ', ini_get('date.timezone'), PHP_EOL;
ini_set('date.timezone', 'Asia/Shanghai');
echo 'current timezone: ', ini_get('date.timezone'), PHP_EOL;
使用 date_default_timezone_set()
PHP中的date_default_timezone_set($timezone_identifie),参数$timezone_identifier是时区标识符,例如UTC(格林威治标准时间)或Asia/上海(北京)函数可以设置当前生命周期中请求的默认时区。
许多框架都使用此方法来设置时区。 比较常见的做法是在PHP中单独一个配置项php 时间相加,在每次请求时加载到代码中的配置阶段根据配置来设置时区。 独立的配置项可以独立在自己的php配置文件中。 或存储在数据库中。
使用示例如下:
<?php
date_default_timezone_set('GMT');
echo 'UTC current date:', date('Y-m-d H:i:s', time()) , PHP_EOL;
date_default_timezone_set('Asia/Shanghai');
echo 'shanghai current time:', date('Y-m-d H:i:s', time()), PHP_EOL;