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中实现记住密码自动登录的代码
Mar 02 PHP
PHP APC配置文件2套和参数详解
Jun 11 PHP
PHP使用Alexa API获取网站的Alexa排名例子
Jun 12 PHP
PHP简单实现HTTP和HTTPS跨域共享session解决办法
May 27 PHP
6个超实用的PHP代码片段
Aug 10 PHP
ubuntu下配置nginx+php+mysql详解
Sep 10 PHP
php实现简单的上传进度条
Nov 17 PHP
thinkphp3.x自定义Action、Model及View的简单实现方法
May 19 PHP
PHPCMS V9 添加二级导航的思路详解
Oct 20 PHP
PHP回调函数简单用法示例
May 08 PHP
php7连接MySQL实现简易查询程序的方法
Oct 13 PHP
Laravel统一错误处理为JSON的方法介绍
Oct 18 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 Header用于页面跳转时的几个注意事项
2016/10/21 PHP
PHP互换两个变量值的方法(不用第三变量)
2016/11/14 PHP
浅谈PHP中的Trait使用方法
2019/03/22 PHP
js获取元素在浏览器中的绝对位置
2010/07/24 Javascript
JQuery 返回布尔值Is()条件判断方法代码
2012/05/14 Javascript
深入理解JavaScript系列(29):设计模式之装饰者模式详解
2015/03/03 Javascript
javascript通过元素id和name直接取得元素的方法
2015/04/28 Javascript
ES6记录异步函数的执行时间详解
2016/08/31 Javascript
VUE利用vuex模拟实现新闻点赞功能实例
2017/06/28 Javascript
浅谈对Angular中的生命周期钩子的理解
2017/07/31 Javascript
Angular @HostBinding()和@HostListener()用法
2018/03/05 Javascript
原生js封装的ajax方法示例
2018/08/02 Javascript
使用Object.defineProperty如何巧妙找到修改某个变量的准确代码位置
2018/11/02 Javascript
Mpvue中使用Vant Weapp组件库的方法步骤
2019/05/16 Javascript
Vue中使用JsonView来展示Json树的实例代码
2020/11/16 Javascript
Python tkinter实现的图片移动碰撞动画效果【附源码下载】
2018/01/04 Python
Python引用计数操作示例
2018/08/23 Python
python selenium firefox使用详解
2019/02/26 Python
OpenCV-Python 摄像头实时检测人脸代码实例
2019/04/30 Python
windows下安装Python虚拟环境virtualenvwrapper-win
2019/06/14 Python
PyQt5固定窗口大小的方法
2019/06/18 Python
Python使用pyautocad+openpyxl处理cad文件示例
2019/07/11 Python
使用python实现离散时间傅里叶变换的方法
2019/09/02 Python
Python下载网易云歌单歌曲的示例代码
2020/08/12 Python
HTML5 video标签(播放器)学习笔记(二):播放控制
2015/04/24 HTML / CSS
深入剖析HTML5 内联框架iFrame
2016/05/04 HTML / CSS
char型变量中能不能存贮一个中文汉字
2015/07/08 面试题
毕业生求职简历的自我评价
2013/10/07 职场文书
应征英语教师求职信
2013/11/27 职场文书
中专毕业生的自我鉴定
2013/12/01 职场文书
水利水电专业自荐信
2014/07/08 职场文书
小学生教师节演讲稿
2014/09/03 职场文书
人事专员岗位职责
2015/02/03 职场文书
酒店前台接待岗位职责
2015/04/02 职场文书
公司前台接待岗位职责
2015/04/03 职场文书
MySQL池化框架学习接池自定义
2022/07/23 MySQL