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生成随机密码的几种方法
Jan 17 PHP
PHP循环语句笔记(foreach,list)
Nov 29 PHP
PHP验证码函数代码(简单实用)
Sep 29 PHP
PHP统计目录大小的自定义函数分享
Nov 18 PHP
ThinkPHP开发框架函数详解:C方法
Aug 14 PHP
php简单解析mysqli查询结果的方法(2种方法)
Jun 29 PHP
php中引用&的用法分析【变量引用,函数引用,对象引用】
Dec 12 PHP
PHP实现的mysql操作类【MySQL与MySQLi方式】
Oct 07 PHP
PHP设计模式之适配器模式定义与用法详解
Apr 03 PHP
PHP使用curl_multi实现并发请求的方法示例
Apr 29 PHP
PHP基于cookie实现统计在线人数功能示例
Jan 16 PHP
php fread函数使用方法总结
May 28 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留言本实例代码
2010/05/09 PHP
php fsockopen中多线程问题的解决办法[翻译]
2011/11/09 PHP
thinkphp循环结构用法实例
2014/11/24 PHP
PHP多进程编程实例详解
2017/07/19 PHP
精选的10款用于构建良好易用性网站的jQuery插件
2011/01/23 Javascript
jQuery自动切换/点击切换选项卡效果的小例子
2013/08/12 Javascript
javascript 获取函数形参个数
2014/07/31 Javascript
js文件包含的几种方式介绍
2014/09/28 Javascript
AngularJS入门教程(一):静态模板
2014/12/06 Javascript
5个数组Array方法: indexOf、filter、forEach、map、reduce使用实例
2015/01/29 Javascript
jQuery实现高亮显示的方法
2015/03/10 Javascript
jQuery添加和删除指定标签的方法
2015/12/16 Javascript
简单讲解jQuery中的子元素过滤选择器
2016/04/18 Javascript
JS实现异步上传压缩图片
2017/04/22 Javascript
Vue实现购物车场景下的应用
2017/11/27 Javascript
vue项目中axios请求网络接口封装的示例代码
2018/12/18 Javascript
js 实现watch监听数据变化的代码
2019/10/13 Javascript
vue.js实现双击放大预览功能
2020/06/23 Javascript
python实现在pickling的时候压缩的方法
2014/09/25 Python
python通过自定义isnumber函数判断字符串是否为数字的方法
2015/04/23 Python
Python网络编程中urllib2模块的用法总结
2016/07/12 Python
[原创]windows下Anaconda的安装与配置正解(Anaconda入门教程)
2018/04/05 Python
Python 生成 -1~1 之间的随机数矩阵方法
2018/08/04 Python
实例分析python3实现并发访问水平切分表
2018/09/29 Python
Django框架使用内置方法实现登录功能详解
2019/06/12 Python
Python利用requests模块下载图片实例代码
2019/08/12 Python
NFL Game Pass欧洲:在线观看NFL比赛直播和点播,以高清质量播放
2018/08/30 全球购物
Vivo俄罗斯官方在线商店:中国智能手机品牌
2019/10/04 全球购物
德国珠宝和配件商店:Styleserver
2021/02/23 全球购物
介绍一下RMI的基本概念
2016/12/17 面试题
生物技术毕业生自荐信
2013/10/23 职场文书
汽车运用工程毕业生自荐信
2013/10/29 职场文书
服务行业口号
2014/06/11 职场文书
升职自荐信范文
2015/03/27 职场文书
小学教师师德培训心得体会
2016/01/09 职场文书
2019年销售人员的职业生涯规划书
2019/03/25 职场文书