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 操作excel文件的方法小结
Dec 31 PHP
PHP中限制IP段访问、禁止IP提交表单的代码
Apr 23 PHP
深入PHP获取随机数字和字母的方法详解
Jun 06 PHP
php批量上传的实现代码
Jun 09 PHP
php漏洞之跨网站请求伪造与防止伪造方法
Aug 15 PHP
php+ajax实现文章自动保存的方法
Dec 30 PHP
php表单提交与$_POST实例分析
Jan 26 PHP
php自定义urlencode,urldecode函数实例
Mar 24 PHP
必须收藏的php实用代码片段
Feb 02 PHP
PHP框架laravel的.env文件配置教程
Jun 07 PHP
解决Laravel5.2 Auth认证退出失效的问题
Oct 14 PHP
PHP filter_var() 函数, 验证判断EMAIL,URL等
Mar 09 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解决和避免form表单重复提交的几种方法
2016/08/31 PHP
php注册系统和使用Xajax即时验证用户名是否被占用
2017/08/31 PHP
同一个表单 根据要求递交到不同页面的实现方法小结
2009/08/05 Javascript
基于Jquery的仿照flash放大图片效果代码
2011/03/16 Javascript
常见JS效果之图片减速度滚动实现代码
2011/12/08 Javascript
js中widow.open()方法使用详解
2013/07/30 Javascript
使用CSS和jQuery模拟select并附提交后取得数据的代码
2013/10/18 Javascript
禁止IE用右键的JS代码
2013/12/30 Javascript
Js实现滚动变色的文字效果
2014/06/16 Javascript
微信企业号开发之微信考勤百度地图定位
2015/09/11 Javascript
WordPress中鼠标悬停显示和隐藏评论及引用按钮的实现
2016/01/12 Javascript
基于Javascript实现倒计时功能
2016/02/22 Javascript
JQuery解析XML数据的几个简单实例
2016/05/18 Javascript
Angular2从搭建环境到开发步骤详解
2016/10/17 Javascript
原生JS查找元素的方法(推荐)
2016/11/22 Javascript
JS实现仿PS的调色板效果完整实例
2016/12/21 Javascript
Vue实现动态响应数据变化
2017/04/28 Javascript
Vue 2中ref属性的使用方法及注意事项
2017/06/12 Javascript
基于JS实现仿京东搜索栏随滑动透明度渐变效果
2017/07/10 Javascript
webpack常用配置总览(小结)
2019/11/18 Javascript
解决ant design vue 表格a-table二次封装,slots渲染的问题
2020/10/28 Javascript
[55:44]完美世界DOTA2联赛决赛 FTD vs Phoenix 第二场 11.08
2020/11/11 DOTA
解决Django的request.POST获取不到内容的问题
2018/05/28 Python
PyTorch的深度学习入门之PyTorch安装和配置
2019/06/27 Python
twilio python自动拨打电话,播放自定义mp3音频的方法
2019/08/08 Python
解决Tensorflow 内存泄露问题
2020/02/05 Python
python使用pandas抽样训练数据中某个类别实例
2020/02/28 Python
帕克纽约:PARKER NY
2018/12/09 全球购物
平面设计师工作职责范文
2013/12/03 职场文书
乡镇消防安全责任书
2014/07/23 职场文书
群众路线教育实践活动自我剖析思想汇报
2014/10/04 职场文书
社区综治工作汇报
2014/10/27 职场文书
学术会议开幕词
2016/03/03 职场文书
Oracle 数据仓库ETL技术之多表插入语句的示例详解
2021/04/12 Oracle
python 实现的截屏工具
2021/05/08 Python
win10滚动条自动往上跑怎么办?win10滚动条自动往上跑的解决方法
2022/08/05 数码科技