PHP中关于时间(戳)、时区、本地时间、UTC时间等的梳理
PHP中关于时间(戳)、时区、本地时间、UTC时间等的梳理
在PHP开发中,我们经常会在时间问题上被搞糊涂,比如我们希望显示一个北京时间,但是当我们使用date函数进行输出时,却发现少了8个小时。几乎所有的php猿类都必须对php中几个重要的时间转换等方法进行研究。本文就来梳理这些问题。
时间戳(timestamp)
GMT
在时间戳这个点上,它是一个概念,而不是具体的编程问题,是计算机世界通用的一种约定。时间戳是指格林尼治时间(GMT)1970年01月01日00时00分00秒到当前时间的总秒数。
GMT(也被称为世界时)是固定为本初子午线经过地区的时间,因此被作为时间参照物。
UTC
协调世界时(UTC)和GMT一样都是一种时间的参照物,但是他们的计算方法不同UTC是以原子时秒长为基础,在时刻上尽量接近于世界时的一种时间计量系统,从精度上讲,更加精确(自然也比GMT更精确),因此被称世界统一时间,世界标准时间,国际协调时间。
Unix时间戳
Unix时间戳是在计算机领域才有的,每一台电脑(服务器)在生产的时候,将GMT/UTC的1970年01月01日00时00分00秒作为起始值进行计算,得到的总秒数就是这个Unix时间戳。至于是GMT还是UTC意义并不大,因为GMT和UTC的1970年01月01日00时00分00秒是一致的,起点一致的情况下,运行的秒数也是一致的。
为什么要时间戳?因为从0开始运行的秒数永远相等,即使出现润秒,也并不影响时间戳。
在php中,可以通过time函数获取时间戳:
time();
但是你应该明白,time()获取的是,当前这台电脑(服务器)上的Unix时间戳。两台电脑可能这个时间戳并不相同,有的甚至相差几十秒。从理论上讲时间戳应该是一摸一样的,但是由于不同的电脑硬件出厂时的设定不同,也会导致GMT/UTC起始值稍有差异,甚至在计算每一秒时也有可能存在差异,这台机器上一秒的时间比另一台要长也是有可能的,时间久了,积累下来的时间差就会体现出来。但是,这种时间差一般不会超过几秒钟。
时区(Time Zone)
但是上面的time()的表述并不准确,因为我们在实践中经常遇到time()得到的值并不是我们想要的。对应的是,date()函数得到的值,也可能出乎我们意料。
什么是时区呢?也就是以GMT/UTC为参照物的时间偏移。
以GMT为参照物的时区
在传统的教材里,全球被划分为24个时区,首先基于经度,其次按照国家或地区,将每一个地区划分到某一个时区,这样可以避免时间上的混乱。在24时区划分之前,世界上的时间换算并没有准确的参照,比如中国人去英国,只能问当地人现在几点,然后拨自己的表来对。而当时区划分之后,中国人到了英国,只需要拨慢8小时即可。在时区划分之前,英国人跟中国人的时间可能并不是严格的8小时之差。
但为了照顾到同一个国家内时间的统一,大部分国家规定自己属于同一个时区,比如中国,统一规定为东八区,这样中国东部和西部可以采用同一个时间。毕竟没有必要大家一定要在早上6点看到日出,沿海城市5点看,乌鲁木齐9点看,并不影响大家的正常作息。
在php中,提供了大量的地区作为时区切换的标准,例如:
date_default_timezone_set('Asia/Shanghai');echo date('Y-m-d H:i:s'); // 获得的是上海所在时区的时间
注意:PRC是中国的地区时标志,并不在Asia中,而是在Others里面找。
以UTC为参照物计算时区
但随着UTC取代GMT成为世界标准时后,时区的计算开始使用UTC作为标准。UTC+8代表东八区,UTC-11代表西十一区。
不过随着精度需求的提升,按大时区计算已经不能满足需求,0.5个时区也被普遍使用,比如UTC+7.5。
在PHP中,我们可以采用这种方式来切换时区。比如:
date_default_timezone_set('UTC');echo date('Y-m-d H:i:s'); // 获取的是0时区时间
php测试代码:time.php
<?php //设置时区 echo '<br/>默认时区时间:'.date("Y-m-d H:i:s").'<br/>'; //可以在文件开头位置设置默认配置的时区 //也可以在php.ini中进行设置date.timezone(所有文件生效) ini_set('date.timezone','Asia/Shanghai'); echo '<br/>上海时区时间:'.date("Y-m-d H:i:s").'<br/>'; //或者直接设置时间格式 date_default_timezone_set('asia/tokyo'); echo '<br/>东京时区时间:'.date("Y-m-d H:i:s").'<br/>'; echo '<br/>格式化时间:'.date("YmdHis").'<br/>'; ?>
输出:
默认时区时间:2018-09-15 10:53:06 上海时区时间:2018-09-15 16:53:06 东京时区时间:2018-09-15 17:53:06 格式化时间:20180915175306
摘自:https://www.tangshuang.net/2794.html
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
一段对话讲完建造者模式
截止今天,小秋学习Java刚刚满三个月。此刻的小秋感觉自己Java学的还不错,想去帅地面前炫耀一番,于是,就发生了一下一番对话..... 得意的小秋 帅地:嗨,小秋,看你今天气色不错啊。最近Java学的怎么样了? 小秋:说实话,比起三个月前我学指针的那段日子,这Java太友好了,感觉就是分分种的事(暗自得意)。 帅地:我靠,你这口气还挺大啊。从c的面向过程到Java的面向对象,还习惯不? 小秋:哎,还行,无非就是“一切皆对象”,Java中的对象感觉类似于C中的结构体。反正不过三七二十一,我脑子里都把他们当成是一个对象就得了。(内心自我感觉良好) 帅地:看你也学了三个月了,要不我随便拿道题考考你?(让你不谦虚,暗自偷笑) 小秋:好啊,正好练练手(嘿嘿,终于可以展现实力了)。 重载多次的构造函数 帅地:假如有一个蛋糕Cake对象,蛋糕这个对象有一个必选属性size,还有一些可选属性apple,banana,orange,mango等,必选属性代表用户必须要指定蛋糕的大小,可选属性代表这些蛋糕要加哪些材料。 小秋:这个很简单啊,创建一个Cake类,里面有size,apple,banana,o...
- 下一篇
Python全栈 Web(JavaScript DOM节点、事件)
1.查询节点 1.根据节点的层级查询节点 1.childNodes 元素节点,文本节点, 2.children 元素节点 3.parentNode 获取父节点 4.nextSibling 获取下一个兄弟节点 有可能是文本节点 5.nextElementSibling 获取下一个兄弟元素节点 6.previousSibling 获取上一个兄弟节点 有可能是文本节点 7.previousElementSibling 获取上一个兄弟元素节点 2.通过标签名查询节点 - 返回数组 document|elem.getElementsByTagName("标签名"); document:整个文档内查找 elem:某个元素内查找 3.通过元素的name属性值查询节点 document.getElementsByName("name属性值"); 返回值:包含指定name属性值的元素的数组 <
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8安装Docker,最新的服务器搭配容器使用
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS8编译安装MySQL8.0.19
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Hadoop3单机部署,实现最简伪集群
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS6,7,8上安装Nginx,支持https2.0的开启