php 学习笔记之关于时区的那点事
科普一下什么是时区
众所周知,地球绕着太阳转的同时也会自转,因此同一时刻不同地区所接收到太阳照射的情况不同,所以有的地区是日出,有的地区是日落,还有的地区可能是黑夜.
既然地球上的不同地区时间不同,那总要有统一的时间刻度才能方便文化科技交流吧,不然大家说的都是当地时间,这样岂不是乱套了?
有问题就要解决问题,不同地区时间不同就要统一时间标准,而统一时间标准的前提就是要弄清楚全球的时间差异到底在哪以及各地的当地时间如何互相转换.
原来的时间标准是格林尼治标准时间,随着精确计时的发展需要,已被新的时间标准所取代,目前的时间标准是世界协调时.
现在有了统一的时间标准,不同地区的时间就可以统一换算成世界协调时再转换成当地时间了,再也不会出现同一时刻不同时间了!
示例:
- 北京时间(
UTC+8) :2019-05-30 13:30:00 - 世界时间(
UTC) :2019-05-30 05:30:00 - 东部时间(
UTC-5) :2019-05-30 00:30:00
格林尼治标准时间
格林尼治标准时间(又称格林威治平均时间或格林威治标准时间,英文是GreenwichMeanTime,简称GMT ),格林尼治标准时间的正午是指当太阳横穿格林尼治子午线时(也就是在格林尼治时)的时间.
格林尼治是英国伦敦的一个小镇,是地理经度的起点,本初子午线所在的经度是零度经度,所在的时区是零时区.
我们知道一天共有 24 小时,对应着全球 24 个时区,而地球自西向东自转,零时区后依次是东一区到东十一区,然后是东十二区.紧接着是西十二区,西十一区到西一区,最后又回到零时区.
其中东十二区和西十二区是同一个时区,又被称为东西十二区.
总的来说,时区分为东十二区和西十二区以及零时区,其中东西十二区是同一个时区,因此共有 24 个时区.

示例:
由于北京位于东八区,比零时区多个 8 个时区,意味着北京时间比格林标准时间快 8 个小时.
所以,北京时间中午 12 点整的时候,格林尼治才清早 4 点钟,估计还在睡觉呢! ( GMT+8 就是北京时间)
格林尼治标准时间与地球自转有关,不能满足精确计时的需求,因此不再作为标准时间,取而代之的是协调世界时.
协调世界时
协调世界时(又称世界统一时间或世界标准时间或国际协调时间,英文是Coordinated Universal Time,简称UTC ),协调世界时是以原子时秒长为基础,在时刻上尽量接近于格林尼治标准时间的一种时间计量系统.
在不需要精确到秒的情况下, GMT 和 UTC 基本一致,但 UTC 是以更加精确的原子时为基础,因此常用于科学计算领域,也是目前时间计量的统一标准.
示例:
北京时间 12:00 ,换算成 GMT 或 UTC 时间都是 04:00 ( UTC+8 也是北京时间)
北京时间
北京时间(又称中国标准时间),是首都北京所在的时区作为中国的标准时间,比格林尼治标准时间快8小时.
我国幅员辽阔,从西到东横跨东五,东六,东七,东八和东九等五个时区.所以全国统一采用首都北京所在的东八时区的区时作为标准时间,也就是北京时间.
时区信息数据库
时区信息数据库,又称 Olson数据库,是一个主要应用于电脑程序以及操作系统的可协作编辑世界时区信息的数据库.
时区信息数据库采用按“区域/位置”命名规范,方便应用于计算机世界,其中英文地名中的空格用下划线“_”代替,连词符“-”只在英文地名本身包含时使用.
示例:
Asia/Hong_Kong: 亚洲/香港Asia/Macau: 亚洲/澳门Asia/Shanghai: 亚洲/上海Asia/Taipei: 亚洲/台北Asia/Urumqi: 亚洲/乌鲁木齐
上述时区主要是
php中所支持的中国时区,参考 亚洲所支持的时区列表
关于时区的编程实现
时区不仅仅是现实生活的问题,计算机编程世界也有时间,自然也离不开时区的概念.
在计算机世界中,一切都是数据,最好时区的概念也能体现在相关数据库中,幸运的是已经有前辈为我们提供了时区信息数据库,而各类语言基本都会提供时区的工具类.
php 中的日期时间函数库是 php 内置函数库,我们可以方便地操作时间,设置时区等.
正常情况下, date 扩展默认是启用的,我们可以输入 phpinfo 打印出 php 的基本信息,然后搜索关键字 date 就可以找到关于 date 扩展的相关信息.
- 示例
<?php
// 获取默认时区
echo "默认时区: ".ini_get("date.timezone")."<br/>";
// 获取当前时区
echo "当前时区: ".date_default_timezone_get()."<br/>";
// 当前时间
echo "当前时间: ".date("Y-m-d H:i:s")."<br>";
// 打印 php 信息
phpinfo();
?>
- 结果
默认时区:
当前时区: UTC
当前时间: 2019-05-30 05:30:00
| 选项 | 值 |
|---|---|
| date/time support(日期时间支持情况) | enabled(已启用) |
| timelib version(时间库版本) | 2016.05(2016.05) |
"Olson" Timezone Database Version(Olson 时区数据库版本) |
2018.5(2018.5) |
| Timezone Database(时区数据库) | internal(内部的) |
| Default timezone(默认时区) | UTC(协调世界时) |
由此可见,假设不设置时区的话,默认时区是协调世界时,该时区和北京时间相比慢
8个小时!
设置时区的三种姿势
翻阅 php 开发文档中可以找到目前所有支持时区列表,下面整理出关于中国的主要时区.
Asia/Hong_Kong: 亚洲/香港Asia/Macau: 亚洲/澳门Asia/Shanghai: 亚洲/上海Asia/Taipei: 亚洲/台北Asia/Urumqi: 亚洲/乌鲁木齐
常用时区是上海,并没有北京,当然也可以设置成
PRC(中华人民共和国)!
如果没有设置时区的话,默认时区应该是协调世界时(UTC),虽说是通用的时间标准,但转换成当地时间还是需要一定换算的,而且看起来也不太舒服.
所以最好还是修改一下时区的设置项,如果业务不考虑国际化需求,那么永久性把时区固定就可以了,如果有国际化的业务场景,那么最好能够动态设置时区,这样就能清楚知道当地时间了.
因此,下面主要提供两种方式来设置时区,分别是静态设置和动态设置,其中动态设置又提供了两种方法.
静态修改 php 配置
php的配置文件默认位于 :/private/etc/php.ini,打开文件后修改date.timezone选项.
由于这种方法是直接修改配置文件,因此时区设置后适用于所有脚本,只不过需要重启服务器方可生效.
- 示例
[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
;date.timezone =
; http://php.net/date.default-latitude
;date.default_latitude = 31.7667
; http://php.net/date.default-longitude
;date.default_longitude = 35.2333
; http://php.net/date.sunrise-zenith
;date.sunrise_zenith = 90.583333
; http://php.net/date.sunset-zenith
;date.sunset_zenith = 90.583333
- 结果
# 去掉;并设置时区,取值可以是PRC,也可以是Asia/Shanghai等时区
date.timezone = PRC
详情请参考: http://php.net/date.timezone
动态设置 php 配置
ini_set 支持设置当前脚本的默认时区选项.
静态设置时区仅仅适合时区固定的情况,如果需要动态切换时区,修改配置文件就不能满足这种情况了.
因此,php 中还提供了动态修改 php.ini 配置文件的方法,ini_set() 方法刚好支持动态设置时区.
不用重启服务器,但仅仅针对当前脚本生效,其中
ini_set方法支持的 php.ini 配置选项列表
- 示例
// 设置当前时区
ini_set("date.timezone", "Asia/Tokyo");
// 获取默认时区
echo "当前时区: ".ini_get("date.timezone")."<br/>";
// 当前时间
echo "当前时间: ".date("Y-m-d H:i:s")."<br>";
- 结果
当前时区: Asia/Tokyo
当前时间: 2019-05-30 14:30:00
动态设置 php 时区
date_default_timezone_set 方法用于设置当前脚本的默认时区.
ini_set 虽然支持设置时区选项,但毕竟不是专业设置时区的方法,date_default_timezone_set 才是专门设置时区的方法.
这两个方法都属于动态设置时区,也都是针对当前脚本生效,也都不用重启服务器就能立马生效.
- 示例
// 获取当前时区
echo "当前时区: ".date_default_timezone_get()."<br/>";
// 设置当前时区
date_default_timezone_set("UTC");
// 获取当前时区
echo "当前时区: ".date_default_timezone_get()."<br/>";
// 当前时间
echo "当前时间: ".date("Y-m-d H:i:s")."<br>";
- 结果
当前时区: Asia/Tokyo
当前时区: UTC
当前时间: 2019-05-30 05:30:00
关于时区的一些总结
时区和时间密切相关,统一时间说的其实是统一时间的标准,这样一个地区的当地时间就可以轻易转换成另一个地区的当地时间了.
目前世界上统一的时间标准是协调时间时(UTC),中国的时间标准是北京时间,北京时间比协调时间时快 8 个小时.
现实世界的时区也要反映到计算机世界,其中时区信息数据库就是用于表示现实世界的时区概念.
由此可见,时区是一个通用概念,不仅 php 有时区,java 和 js 等语言也有时区概念,可以说只要有时间的地方都离不开时区.
关于时区的小技能,你 get 到了吗?
- 美剧<<闪电侠>>当地时间是星期二晚上八点开播,请问北京时间何时开播?
- 英剧<<神探夏洛克>>北京时间凌晨四点半开播,请问当地时间是何时开播?
- 泰剧<<新铁石心肠>>当地时间是晚上九点二十开播,请问北京时间是何时?
参考资料
php 学习笔记之关于时区的那点事的更多相关文章
- js学习笔记----JavaScript中DOM扩展的那些事
什么都不说,先上总结的图~ Selectors API(选择符API) querySelector()方法 接收一个css选择符,返回与该模式匹配的第一个元素,如果没有找到匹配的元素,返回null ...
- Oracle学习笔记三 SQL命令
SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
- 两千行PHP学习笔记
亲们,如约而至的PHP笔记来啦~绝对干货! 以下为我以前学PHP时做的笔记,时不时的也会添加一些基础知识点进去,有时还翻出来查查. MySQL笔记:一千行MySQL学习笔记http://www.cnb ...
- Android学习笔记(十三)——广播机制
//此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! Android 中的每个应用程序都可以对自己感兴趣的广播进行注册,这样该程序就只会接收到自己所关心的广播内容 ...
- 20145330第八周《Java学习笔记》
20145330第八周<Java学习笔记> 第十五章 通用API 通用API 日志:日志对信息安全意义重大,审计.取证.入侵检验等都会用到日志信息 日志API Logger:注意无法使用构 ...
- 20145330第七周《Java学习笔记》
20145330第七周<Java学习笔记> 第十三章 时间与日期 认识时间与日期 时间的度量 GMT(格林威治标准时间):现在不是标准时间 世界时(UT):1972年UTC出来之前,UT等 ...
- Dynamic CRM 2013学习笔记(十五)报表设计:报表入门、开发工具及注意事项
本文是关于CRM 2013报表开发入门介绍,包括开发工具的使用,以及不同于普通Reporting service的相关注意事项. 一.CRM报表简介 报表有两种,SQL-based报表和Fetch-b ...
- [原创]java WEB学习笔记52:国际化 fmt 标签,国际化的总结
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
随机推荐
- 5.jenkins 构建任务2--PHP项目
推送代码 PHP 项目 然后我们要做的就是将 .jenkins下面 workspace下的代码. 推送到我们的项目机器上面 就ok了. 我们可以在php的jenkins的 项目配置中选择使用shell ...
- python爬虫之csv文件
一.二维数据写入csv文件 题目要求: 读入price2016.csv文件,将其中的数据读出,将数字部分计算百分比后输出到price2016out.csv文件中 知识点: 对于列表中存储的二维数据, ...
- 剑指Offer-33.第一个只出现一次的字符(C++/Java)
题目: 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写). 分析: 遍历字符串,利用Ha ...
- cartographer 3D scan matching 理解
cartographer 3D scan matching没有论文和其它资料,因此尝试通过源码理解其处理方法,理解不当之处还请指正. 目录: 0.2D 匹配方法简介 1.real time corre ...
- lua require路径设置实例
1.首先要强调的是,lua require的路径用的是斜杠"/",而不是从Windows文件属性那里复制来的反斜杠"\". 2.通过 print(pagckag ...
- 想成为Python高手,必须看这篇爬虫原理介绍!(附29个爬虫项目)
互联网是由一个个站点和网络设备组成的大网,我们通过浏览器访问站点,站点把HTML.JS.CSS代码返回给浏览器,这些代码经过浏览器解析.渲染,将丰富多彩的网页呈现我们眼前. 一.爬虫是什么? 如果我们 ...
- DatabaseLibrary -数据库操作
操作数据库: Table Must Exist 验证表必须存在,存在则Pass,反之Fail Delete All Rows From Table 删除数据库中表的所有行 Execute Sql St ...
- C# get files and write the files full name in txt
static void GetAllFiles() { string path = "filepath"; var allFiles = Directory.GetFiles(pa ...
- Oracle大数据解决方案》学习笔记5——Oracle大数据机的配置、部署架构和监控-1(BDA Config, Deployment Arch, and Monitoring)
原创预见未来to50 发布于2018-12-05 16:18:48 阅读数 146 收藏 展开 这章的内容很多,有的学了. 1. Oracle大数据机——灵活和可扩展的架构 2. Hadoop集群的 ...
- springboot依赖
springboot依赖整合 <parent> <groupId>org.springframework.boot</groupId> <artifactId ...