PHP应用跨时区功能的实现方法


Posted in PHP onMarch 21, 2019

PHP中要实现一个跨时区的应用,也就是不同时区登录的用户需要看到自己时区的时间,同时也要能够进行时区的切换。

这里的思路是,系统中所有存储的时间都是GMT(UTC)时间,用户登录时,根据用户所在的时区进行对应的显示。

关于PHP中时间函数的使用就参考:PHP时间函数使用详解。这里我们先了解一下PHP中时区的设置方法。PHP中进行设置的方法比较灵活多样,可以在php.ini中设置date.timezone属性、可以通过代码,调用ini_set(‘date.timezone', ‘')设置,也可以使用函数 date_default_timezone_set(),或者在htaccess文件中设置。

服务器的默认时区,如果设置的和我们希望的时区不符,而且我们也没有权限修改全局的时区配置,就只有借助于代码了。

PHP还提供了一个方便的函数,gmdate(),可以让我们不用关心服务器的时区设置而始终获得GMT时间,我的思路就是基于这个函数。

我的项目中使用了Codeigniter这个框架,框架中的date这个helper提供了几个方便的函数,可以用来处理应用中的多时区情况。

其中 now() 始终返回的是gmt的当前时间;local_to_gmt() 可以将本地的时间转换为gmt时间;gmt_to_local() 可以将gmt时间转换为本地时间;

考虑一个典型的应用场景:

用户登陆后,要显示当前时间。这是我们可以使用now()获得标准的gmt时间,然后使用gmt_to_local()函数转化为用户所在时区的时间。

用户要发布一个时间。用户发布了一个“2010-07-10 18:30:00”的时间,我们不能直接存入数据库,必须先利用local_to_gmt() 转化标准的gmt时间存入数据库,这样才能保证整个系统中的时间保持一致。

这两个函数的细节,其实都是根据时区,然后进行相应的运算得来。计算的时候,也可以考虑夏令时,但是所在时区夏令时的开始和结束时间,则需要自己维护。

codeigniter中提供了一份较为完整的时区列表,timezone_menu() 可以显示一个时区的下拉列表,但是这个列表中的时间不能完全对应到PHP自带的时区显示上,这是PHP本身的问题,不过可以通过下面这个函数,来让输入的每个时区,都可以获得一个对应的时区文字显示。

if( ! function_exists("tz_offset_to_name") ) 
{ 
  /* Takes a GMT offset (in hours) and returns a timezone name */ 
  function tz_offset_to_name($offset) 
  { 
      $offset *= 3600; // convert hour offset to seconds 
      $abbrarray = timezone_abbreviations_list(); 
      foreach ($abbrarray as $abbr) 
      { 
          foreach ($abbr as $city) 
          { 
              if ($city['offset'] == $offset) 
              { 
                  return $city['timezone_id']; 
              } 
          } 
      } 
      return FALSE; 
  } 
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

PHP 相关文章推荐
php调用mysql数据 dbclass类
May 07 PHP
PHP中根据IP地址判断城市实现城市切换或跳转代码
Sep 04 PHP
Apache下禁止php文件被直接访问的解决方案
Apr 25 PHP
PHP中file_exists函数不支持中文名的解决方法
Jul 26 PHP
PHP生成条形图的方法
Dec 10 PHP
PHP中使用imagick实现把PDF转成图片
Jan 26 PHP
WIFI万能钥匙密码查询接口实例
Sep 28 PHP
PHP定时执行任务的3种方法详解
Dec 21 PHP
PHP编写学校网站上新生注册登陆程序的实例分享
Mar 21 PHP
Linux php 中文乱码的快速解决方法
May 13 PHP
Laravel jwt 多表(多用户端)验证隔离的实现
Dec 18 PHP
JS中彻底删除JSON对象组成的数组中的元素
Sep 22 PHP
PHP时间函数使用详解
Mar 21 #PHP
PHP抽象类与接口的区别详解
Mar 21 #PHP
PHP CURL使用详解
Mar 21 #PHP
使用ucenter实现多站点同步登录的讲解
Mar 21 #PHP
PHP设计模式之工厂模式(Factory Pattern)的讲解
Mar 21 #PHP
使用PHP反射机制来构造"CREATE TABLE"的sql语句
Mar 21 #PHP
启用OPCache提高PHP程序性能的方法
Mar 21 #PHP
You might like
深入PHP FTP类的详解
2013/06/13 PHP
判断是否输入完毕再激活提交按钮
2006/06/26 Javascript
extjs 学习笔记(三) 最基本的grid
2009/10/15 Javascript
图片无缝滚动代码(向左/向下/向上)
2013/04/10 Javascript
js window.print实现打印特定控件或内容
2013/09/16 Javascript
JS实现点击链接取消跳转效果的方法
2014/01/24 Javascript
Vue.js 2.0窥探之Virtual DOM到底是什么?
2017/02/10 Javascript
JavaScript中 DOM操作方法小结
2017/04/25 Javascript
微信小程序图片宽100%显示并且不变形
2017/06/21 Javascript
基于node.js的fs核心模块读写文件操作(实例讲解)
2017/09/10 Javascript
微信小程序实现跟随菜单效果和循环嵌套加载数据
2017/11/21 Javascript
react-native android状态栏的实现
2018/06/15 Javascript
webpack开发环境和生产环境的深入理解
2018/11/08 Javascript
小程序实现多列选择器
2019/02/15 Javascript
Vue安装浏览器开发工具的步骤详解
2019/05/12 Javascript
Vue登录拦截 登录后继续跳转指定页面的操作
2020/08/04 Javascript
jdk1.8+vue elementui实现多级菜单功能
2020/09/24 Javascript
在Python中使用__slots__方法的详细教程
2015/04/28 Python
Python实现修改IE注册表功能示例
2018/05/10 Python
python遍历文件夹,指定遍历深度与忽略目录的方法
2018/07/11 Python
python目标检测给图画框,bbox画到图上并保存案例
2020/03/10 Python
Python-jenkins 获取job构建信息方式
2020/05/12 Python
python 图像插值 最近邻、双线性、双三次实例
2020/07/05 Python
Airbnb爱彼迎官网:成为爱彼迎房东,赚取收入
2019/03/14 全球购物
导游实习生自荐书
2014/01/28 职场文书
部队党性分析材料
2014/02/16 职场文书
给全校老师的建议书
2014/03/13 职场文书
2014年入党积极分子学习三中全会思想汇报
2014/09/13 职场文书
小学教师先进事迹材料
2014/12/15 职场文书
给客户的感谢信
2015/01/21 职场文书
汽车4S店销售经理岗位职责
2015/04/02 职场文书
办公室行政主管岗位职责
2015/04/09 职场文书
机械生产实习心得体会
2016/01/22 职场文书
职业规划从高考志愿专业选择开始
2019/08/08 职场文书
虚拟机linux端mysql数据库无法远程访问的解决办法
2021/05/26 MySQL
MyBatis XPathParser解析器使用范例详解
2022/07/15 Java/Android