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

PHP中关于时间(戳)、时区、本地时间、UTC时间等的梳理的更多相关文章

  1. UTC、GTC时间和本地时间(Linux默认使用UTC时间,要修改一下)

    1.问题 对于装有Windows和Linux系统的机器,进入Windows显示的时间和Linux不一致,Linux中的时间比Windows提前8个小时. 2.解决方法 修改/etc/default/r ...

  2. linux设置系统时间与时区以及设置bios时间同步系统时间

    有装过Linux系统的人,可能都会有这样的经历,就是该机器安装windows系统时,时间正确,但是安装了linux系统后,尽管时区选择正确,也会发现系统时间不对.这是由于安装系统时采用了UTC,那么什 ...

  3. WMware Workstation——时间和时区问题

    对于学习Linux的人来说,最常见的做法就是在WMware Workstation下安装Linux系统.在WMware Workstation可能会有几处导致时间.时区问题. UTC时间导致时间不一致 ...

  4. 【应用服务 App Service】发布到Azure上的应用显示时间不是本地时间的问题,修改应用服务的默认时区

    问题情形 应用程序发布到App Service后,时间显示不是北京时间,默认情况为UTC时间,比中国时间晚 8 个小时. 详细日志 无 问题原因 Azure 上所有的服务时间都采用了 UTC 时间. ...

  5. 时区,GMT时间,UTC时间,UNIX时间戳

    秒 秒是一个时间基本单位.一天24小时,一小时60分,一分钟60秒,这来自于秒的定义--1秒的时间间隔为平均太阳日[1]的1⁄86400.到了20世纪中叶,人们发现地球自转的时间并不是恒定的,于是在1 ...

  6. Windows的本地时间(LocalTime)、系统时间(SystemTime)、格林威治时间(UTC-Time)、文件时间(FileTime)之间的转换

    今天处理了一个Bug,创建历史数据时脚本函数的起始时间不赋值或者赋0值时,计算引擎推给历史库的UTC时间为-288000000000,一开始以为是bug,经过分析后发现不赋值默认给起始时间赋0值,而此 ...

  7. 关于UTC时间和本地时间

    收藏了个类Publics  可以实现本地时间和UTC时间的转换 UCT时间=本地时间-8    本地时间比UTC时间快8小时 element-ui的日期选择器上  选择的时间显示的是本地时间   但实 ...

  8. QDateTime 本地时间和UTC时间转换问题

    先说一下UTC,搜索360百科: 协调世界时,又称世界统一时间.世界标准时间.国际协调时间,简称UTC,是以原子时秒长为基础,在时刻上尽量接近于世界时的一种时间计量系统.1979年12月3日在内瓦举行 ...

  9. CloudStack中云主机的UTC时间转为本地时间

    CloudStack项目中使用的时间是UTC时间,具体什么是UTC时间大家可以百度,但是我们需要的时间是正常的时间,所以在国泰君安开发测试云中,同步资源管理中虚拟机的同步管理,需要对虚拟机的时间格式化 ...

  10. Django时区导致的datetime时间比较报错

    我们使用python 的datetime模块比较Django数据库Datetime字段的时候,可能会出现报错: TypeError: can't compare offset-naive and of ...

随机推荐

  1. 《ASP.NET MVC 5 破境之道》:第一境 ASP.Net MVC5项目初探 — 第一节:运行第一个MVC5项目

    第一境 ASP.Net MVC5项目初探 — 第一节:运行第一个MVC5项目 创建一个MVC项目,是很容易的,大部分工作,VS都帮我们完成了.只需要按照如下步骤按部就班就可以了. 打开VS2017,选 ...

  2. sql server生成自动增长的字母数字字符串

    在开发的过程中,我们经常会遇到要生成一些固定格式字符串,例如“BX201903150001”,结构为:BX+日期+N位序号,类似这种的字符串我们很难生成,在这里我们借助一个存储过程来实现这个功能. 1 ...

  3. Redis持久化————AOF与RDB模式

      1.        官方说明:  By default Redis asynchronously dumps the dataset on disk. This mode is good enou ...

  4. Mac OS 10.12 - 解决“bad interpreter: No such file or directory”问题!

    在Mac OS10.12里面执行shell脚本时候,无法执行,错误提示:“bad interpreter: No such file or directory”,经过上网搜索,最终解决了,解决方法,首 ...

  5. jzoj3519

    我們考慮將一個節點x的所有兒子的數都改成y 記lcm[x]表示一個點的所有子節點的lcm值 那麼我們會發現y*deg[x] 要被lcm[x]整除 那麼x就會比x所有子節點最小的數小,記為z 那麼x就是 ...

  6. 协程IO多路复用

    协程:单线程下实现并发并发:伪并行,遇到IO就切换,单核下多个任务之间切换执行,给你的效果就是貌似你的几个程序在同时执行.提高效率任务切换 + 保存状态并行:多核cpu,真正的同时执行串行:一个任务执 ...

  7. [Swift实际操作]七、常见概念-(8)日历Calendar和时区TimerZone

    本文将为你演示日历的一些属性,以及如何利用日历,查询是否为昨天.今天和明天. 首先引入需要用到的界面工具框架 import UIKit 然后生成一个日历对象,并获得用户当前的日历. var calen ...

  8. easyui 中iframe嵌套页面,大弹窗自适应居中的解决方法。$('#win').window()

    easyui 中iframe嵌套页面,大弹窗自适应居中的解决方法.$('#win').window() 以下是左边栏和头部外层遮罩显示和隐藏方法 /*外层 遮罩显示*/ function wrapMa ...

  9. Vue-Router路由Vue-CLI脚手架和模块化开发 之 使用props替代路由对象的方式获取参数

    在上一章博文中使用路由对象$route获取参数时,组件和路由对象耦合,在这篇博文中就可以使用props来进行解耦: 1.在组件中使用props选项定义数据,接收参数: 2.在路由中,使用props选项 ...

  10. Java之集合(六)PriorityQueue

    转载请注明源出处:http://www.cnblogs.com/lighten/p/7299233.html 1.前言 本章介绍队列中的PriorityQueue--优先队列,顾名思义,这是一个可以指 ...