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 相关文章推荐
PHP5在Apache下的两种模式的安装
Sep 05 PHP
BBS(php & mysql)完整版(三)
Oct 09 PHP
php判断手机访问还是电脑访问示例分享
Jan 20 PHP
php读取文件内容的三种可行方法示例介绍
Feb 08 PHP
PHP设置进度条的方法
Jul 08 PHP
Zend Framework上传文件重命名的实现方法
Nov 25 PHP
详谈php ip2long 出现负数的原因及解决方法
Apr 05 PHP
php 7新特性之类型申明详解
Jun 06 PHP
PHP实现的登录页面信息提示功能示例
Jul 24 PHP
PHP实现的大文件切割与合并功能示例
Apr 10 PHP
php支付宝系列之电脑网站支付
May 30 PHP
laravel5环境隐藏index.php后缀(apache)的方法
Oct 12 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代码把全角数字转为半角数字
2007/12/10 PHP
PHP中将字符串转化为整数(int) intval() printf() 性能测试
2020/03/20 PHP
PHP UTF8中文字符截断函数代码
2012/09/11 PHP
PHP通过串口实现发送短信
2015/07/08 PHP
php实现mysql数据库连接操作及用户管理
2015/11/08 PHP
php一个文件搞定微信jssdk配置
2016/12/12 PHP
php实现的顺序线性表示例
2019/05/04 PHP
JS实现时间格式化的方式汇总
2013/10/16 Javascript
node.js中的fs.fstatSync方法使用说明
2014/12/15 Javascript
JS中的二叉树遍历详解
2016/03/18 Javascript
Bootstrap Img 图片样式(推荐)
2016/12/13 Javascript
angularjs中ng-attr的用法详解
2016/12/31 Javascript
Vue.js基础学习之class与样式绑定
2017/03/20 Javascript
JS实现table表格固定表头且表头随横向滚动而滚动
2017/10/26 Javascript
Dropify.js图片宽高自适应的方法
2017/11/27 Javascript
使用veloticy-ui生成文字动画效果
2018/02/08 Javascript
详解vue组件基础
2018/05/04 Javascript
详解webpack之图片引入-增强的file-loader:url-loader
2018/10/08 Javascript
Python Queue模块详解
2014/11/30 Python
python实现爬虫统计学校BBS男女比例之数据处理(三)
2015/12/31 Python
解决nohup执行python程序log文件写入不及时的问题
2019/01/14 Python
Python+OpenCV 实现图片无损旋转90°且无黑边
2019/12/12 Python
浅谈Python3多线程之间的执行顺序问题
2020/05/02 Python
使用Python实现批量ping操作方法
2020/05/06 Python
JACK & JONES英国官方网站:欧洲领先的男装生产商
2017/09/27 全球购物
Nordgreen英国官网:斯堪的纳维亚设计师手表
2018/10/24 全球购物
美团网旗下网上订餐平台:美团外卖
2020/03/05 全球购物
电大会计学自我鉴定
2014/02/06 职场文书
奥巴马就职演讲稿
2014/05/15 职场文书
文秘专业应届生求职信
2014/05/26 职场文书
党员干部三严三实心得体会
2014/10/13 职场文书
房屋分割离婚协议书范本
2014/12/01 职场文书
2015年全民创业工作总结
2015/07/23 职场文书
2016入党心得体会范文
2016/01/06 职场文书
《平行四边形的面积》教学反思
2016/02/16 职场文书
Python3中PyQt5简单实现文件打开及保存
2021/06/10 Python