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中使用XML
Oct 09 PHP
深入理解PHP中的Session和Cookie
Jun 21 PHP
PHP快速按行读取CSV大文件的封装类分享(也适用于其它超大文本文件)
Apr 10 PHP
PHPMailer发送HTML内容、带附件的邮件实例
Jul 01 PHP
thinkphp实现163、QQ邮箱收发邮件的方法
Dec 18 PHP
WordPress开发中的get_post_custom()函数使用解析
Jan 04 PHP
PHP+MySQL统计该库中每个表的记录数并按递减顺序排列的方法
Feb 15 PHP
YII视图整合kindeditor扩展的方法
Jul 13 PHP
总结PHP中数值计算的注意事项
Aug 14 PHP
PHP实现将几张照片拼接到一起的合成图片功能【便于整体打印输出】
Nov 14 PHP
PHP赋值的内部是如何跑的详解
Jan 13 PHP
Laravel如何自定义command命令浅析
Mar 23 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编程效率的方法
2013/11/07 PHP
php实现网页缓存的工具类分享
2015/07/14 PHP
PHP观察者模式示例【Laravel框架中有用到】
2018/06/15 PHP
Ubuntu 16.04中Laravel5.4升级到5.6的步骤
2018/12/07 PHP
php实现映射操作实例详解
2019/10/02 PHP
关于Ext中form移除textfield方法:hide(),setVisible(false),remove()
2010/12/02 Javascript
在多个页面使用同一个HTML片段的代码
2011/03/04 Javascript
jQuery EasyUI API 中文文档 - Draggable 可拖拽
2011/09/29 Javascript
JQuery性能优化的几点建议
2014/05/14 Javascript
jquery控制表单输入框显示默认值的方法
2015/05/22 Javascript
js点击按钮实现带遮罩层的弹出视频效果
2015/12/19 Javascript
js计算系统当前日期是星期几的方法
2016/07/14 Javascript
使用ReactJS实现tab页切换、菜单栏切换、手风琴切换和进度条效果
2016/10/17 Javascript
Javascript使用SWFUpload进行多文件上传
2016/11/16 Javascript
Angular-Touch库用法示例
2016/12/22 Javascript
利用node.js+mongodb如何搭建一个简单登录注册的功能详解
2017/07/30 Javascript
详解webpack多页面配置记录
2018/01/22 Javascript
详解ajax的data参数错误导致页面崩溃
2018/04/30 Javascript
配置eslint规范项目代码风格
2019/03/11 Javascript
基于layui table返回的值的多级嵌套的解决方法
2019/09/19 Javascript
js prototype深入理解及应用实例分析
2019/11/25 Javascript
Vue组件通信中非父子组件传值知识点总结
2019/12/05 Javascript
design vue 表格开启列排序的操作
2020/10/28 Javascript
RC4文件加密的python实现方法
2015/06/30 Python
python语言使用技巧分享
2016/05/31 Python
Python实现字典排序、按照list中字典的某个key排序的方法示例
2018/12/18 Python
Keras之fit_generator与train_on_batch用法
2020/06/17 Python
python根据用户需求输入想爬取的内容及页数爬取图片方法详解
2020/08/03 Python
numpy中生成随机数的几种常用函数(小结)
2020/08/18 Python
会计助理岗位职责
2014/02/17 职场文书
建设单位项目负责人任命书
2014/06/06 职场文书
会计个人实习计划书
2014/08/15 职场文书
擅自离岗检讨书
2014/09/12 职场文书
2014年文艺部工作总结
2014/11/17 职场文书
python playwright 自动等待和断言详解
2021/11/27 Python
python 使用tkinter与messagebox写界面和弹窗
2022/03/20 Python