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
Oct 09 PHP
聊天室php&mysql(三)
Oct 09 PHP
header跳转和include包含问题详解
Sep 08 PHP
Yii使用CLinkPager分页实例详解
Jul 23 PHP
php中ftp_chdir与ftp_cdup函数用法
Nov 18 PHP
php中异常处理方法小结
Jan 09 PHP
PHP JSON格式的中文显示问题解决方法
Apr 09 PHP
大家都应该掌握的PHP关联数组使用技巧
Dec 25 PHP
ThinkPHP使用Ueditor的方法详解
May 20 PHP
基于PHP生成简单的验证码
Jun 01 PHP
简单谈谈PHP面向对象之标识对象
Jun 27 PHP
php操作redis常见方法示例【key与value操作】
Apr 14 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的ob_start();控制您的浏览器cache!
2007/02/14 PHP
The specified CGI application misbehaved by not returning a complete set of HTTP headers
2011/03/31 PHP
php 归并排序 数组交集
2011/05/10 PHP
网站防止被刷票的一些思路与方法
2015/01/08 PHP
thinkphp下MySQL数据库读写分离代码剖析
2017/04/18 PHP
Laravel等框架模型关联的可用性浅析
2019/12/15 PHP
javascript获得CheckBoxList选中的数量
2009/10/27 Javascript
jquery及原生js获取select下拉框选中的值示例
2013/10/25 Javascript
关于javascript模块加载技术的一些思考
2014/11/28 Javascript
JavaScript实现带缓冲效果的随屏滚动漂浮广告代码
2015/11/06 Javascript
跟我学习javascript的this关键字
2020/05/28 Javascript
纯JS实现轮播图
2017/02/22 Javascript
ionic实现底部分享功能
2017/05/11 Javascript
JS同步、异步、延迟加载的方法
2018/05/05 Javascript
layDate日期控件使用方法详解
2018/11/15 Javascript
基于Three.js实现360度全景图片
2018/12/30 Javascript
vue element upload组件 file-list的动态绑定实现
2019/10/11 Javascript
使用vue实现通过变量动态拼接url
2020/07/22 Javascript
原生js实现简单轮播图
2020/10/26 Javascript
uniapp微信小程序:key失效的解决方法
2021/01/20 Javascript
python解析json实例方法
2013/11/19 Python
python从网络读取图片并直接进行处理的方法
2015/05/22 Python
python 全文检索引擎详解
2017/04/25 Python
python+selenium开发环境搭建图文教程
2017/08/11 Python
python 实现调用子文件下的模块方法
2018/12/07 Python
浅谈Python2之汉字编码为unicode的问题(即类似\xc3\xa4)
2019/08/12 Python
python实现证件照换底功能
2019/08/20 Python
解决pyinstaller打包运行程序时出现缺少plotly库问题
2020/06/02 Python
Python基于Twilio及腾讯云实现国际国内短信接口
2020/06/18 Python
Python+pyftpdlib实现局域网文件互传
2020/08/24 Python
python实现学生信息管理系统(精简版)
2020/11/27 Python
python实现excel公式格式化的示例代码
2020/12/23 Python
css3 伪类选择器快速复习小结
2019/09/10 HTML / CSS
初中生物教学反思
2014/01/10 职场文书
教你怎么用Python处理excel实现自动化办公
2021/04/30 Python
如何打开Win11系统注册表编辑器?Win11注册表编辑器打开修复方法
2022/04/05 数码科技