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 配置文件中open_basedir选项作用
Jul 19 PHP
在PHP中使用反射技术的架构插件使用说明
May 18 PHP
UCenter 批量添加用户的php代码
Jul 17 PHP
一些php项目中比较通用的php自建函数的详解
Jun 06 PHP
php对csv文件的读取,写入,输出下载操作详解
Aug 10 PHP
分享一段php获取linux服务器状态的代码
May 27 PHP
异步加载技术实现当滚动条到最底部的瀑布流效果
Sep 16 PHP
PHP实现中文圆形印章特效
Jun 19 PHP
php计划任务之验证是否有多个进程调用同一个job的方法
Dec 07 PHP
PHP+Apache+Mysql环境搭建教程
Aug 01 PHP
php对接java现实加签验签的实例
Nov 25 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中的串行化变量和序列化对象
2006/09/05 PHP
PHP详细彻底学习Smarty
2008/03/27 PHP
PHP curl批处理及多请求并发实现方法分析
2018/08/15 PHP
JQuery判断HTML元素是否存在的两种解决方法
2013/12/26 Javascript
document.addEventListener使用介绍
2014/03/07 Javascript
JQuery解析HTML、JSON和XML实例详解
2014/03/29 Javascript
JavaScript中的console.group()函数详细介绍
2014/12/29 Javascript
jQuery学习笔记之jQuery中的$
2015/01/19 Javascript
JavaScript检测原始值、引用值、属性
2016/06/20 Javascript
Vue中使用vue-i18插件实现多语言切换功能
2018/04/25 Javascript
JavaScript 中的12种循环遍历方法【总结】
2018/05/31 Javascript
生产制造追溯系统之再说条码打印
2019/06/03 Javascript
Python自动化开发学习之三级菜单制作
2017/07/14 Python
python 中的int()函数怎么用
2017/10/17 Python
Python实现矩阵转置的方法分析
2017/11/24 Python
Python标准库笔记struct模块的使用
2018/02/22 Python
TensorFlow实现非线性支持向量机的实现方法
2018/04/28 Python
Pytorch 抽取vgg各层并进行定制化处理的方法
2019/08/20 Python
python列表推导式操作解析
2019/11/26 Python
Pycharm 安装 idea VIM插件的图文教程详解
2020/02/21 Python
Python实现屏幕录制功能的代码
2020/03/02 Python
python中查看.db文件中表格的名字及表格中的字段操作
2020/07/07 Python
英国亚马逊官方网站:Amazon.co.uk
2019/08/09 全球购物
几道PHP的面试题
2012/05/19 面试题
指针和引用有什么区别
2013/01/13 面试题
公司前台接待岗位职责
2013/12/03 职场文书
高一化学教学反思
2014/02/05 职场文书
商业门面租房协议书
2014/11/25 职场文书
2014年除四害工作总结
2014/12/06 职场文书
党员思想汇报材料
2014/12/19 职场文书
大学毕业生个人总结
2015/02/28 职场文书
中学生自我评价范文
2015/03/03 职场文书
2015年百日安全活动总结
2015/03/26 职场文书
Angular CLI发布路径的配置项浅析
2021/03/29 Javascript
python自动化之如何利用allure生成测试报告
2021/05/02 Python
《现实主义勇者的王国再建记》第三弹OST全曲试听片段公开
2022/04/04 日漫