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)一
Oct 09 PHP
使用PHP数组实现无限分类,不使用数据库,不使用递归.
Dec 09 PHP
PHP 面向对象实现代码
Nov 11 PHP
浅析linux下apache服务器的配置和管理
Aug 10 PHP
php判断ip黑名单程序代码实例
Feb 24 PHP
phpmyadmin配置文件现在需要绝密的短密码(blowfish_secret)的2种解决方法
May 07 PHP
PHP SPL标准库中的常用函数介绍
May 11 PHP
在PHP程序中使用Rust扩展的方法
Jul 03 PHP
2017年最新PHP经典面试题目汇总(上篇)
Mar 17 PHP
关于ThinkPHP中的异常处理详解
May 11 PHP
Mac M1安装mnmp (Mac+Nginx+MySQL+PHP) 开发环境
Mar 29 PHP
PHP策略模式写法
Apr 01 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
Ajax+PHP 边学边练之四 表单
2009/11/27 PHP
destoon各类调用汇总
2014/06/20 PHP
php通过array_unshift函数添加多个变量到数组前端的方法
2015/03/18 PHP
由php中字符offset特征造成的绕过漏洞详解
2017/07/07 PHP
DOM相关内容速查手册
2007/02/07 Javascript
通过jquery实现tab标签浏览效果
2007/02/20 Javascript
Javascript 函数对象的多重身份
2009/06/28 Javascript
增强用户体验友好性之jquery easyui window 窗口关闭时的提示
2012/06/22 Javascript
获取offsetTop和offsetLeft值的js代码(兼容)
2013/04/16 Javascript
javascript数组常用方法汇总
2016/09/10 Javascript
canvas实现手机端用来上传用户头像的代码
2016/10/20 Javascript
JS中BOM相关知识点总结(必看篇)
2016/11/22 Javascript
Javascript下拉刷新的简单实现
2017/02/14 Javascript
angular.js 路由及页面传参示例
2017/02/24 Javascript
Bootstrap datepicker日期选择器插件使用详解
2017/07/26 Javascript
vue mixins组件复用的几种方式(小结)
2017/09/06 Javascript
vue实现长图垂直居上 vue实现短图垂直居中
2017/10/18 Javascript
element-ui中的select下拉列表设置默认值方法
2018/08/24 Javascript
ES6使用export和import实现模块化的方法
2018/09/10 Javascript
JavaScript实现多张图片放大镜效果示例【不限定图片尺寸,rem单位】
2019/05/14 Javascript
微信公众号开发之微信支付代码记录的实现
2019/10/16 Javascript
vue打开子组件弹窗都刷新功能的实现
2020/09/21 Javascript
原生js实现自定义滚动条
2021/01/20 Javascript
[39:02]DOTA2亚洲邀请赛 3.31 小组赛 B组 Mineski vs VGJ.T
2018/04/01 DOTA
Python完全新手教程
2007/02/08 Python
Django框架中的对象列表视图使用示例
2015/07/21 Python
Python 二叉树的层序建立与三种遍历实现详解
2019/07/29 Python
pyqt5、qtdesigner安装和环境设置教程
2019/09/25 Python
解决pyPdf和pyPdf2在合并pdf时出现异常的问题
2020/04/03 Python
Pycharm配置autopep8实现流程解析
2020/11/28 Python
解决HTML5中滚动到底部的事件问题
2019/08/22 HTML / CSS
Hotels.com香港酒店网:你的自由行酒店订房专家
2018/01/22 全球购物
欧洲领先的火车票和大巴票预订平台:Trainline
2018/12/26 全球购物
2016年党员岗位承诺书
2016/03/24 职场文书
python实现求纯色彩图像的边框
2021/04/08 Python
聊聊pytorch测试的时候为何要加上model.eval()
2021/05/23 Python