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中10个不常见却非常有用的函数
Mar 21 PHP
php 数据库字段复用的基本原理与示例
Jul 22 PHP
关于初学PHP时的知识积累总结
Jun 07 PHP
那些年我们错过的魔术方法(Magic Methods)
Jan 14 PHP
PHP里8个鲜为人知的安全函数分析
Dec 09 PHP
php利用smtp类实现电子邮件发送
Oct 30 PHP
yii2.0实现验证用户名与邮箱功能
Dec 22 PHP
PHP基于IMAP收取邮件的方法示例
Aug 07 PHP
PHP htmlspecialchars()函数用法与实例讲解
Mar 08 PHP
PHP面向对象程序设计__tostring()和__invoke()用法分析
Jun 12 PHP
PHP中strtr与str_replace函数运行性能简单测试示例
Jun 22 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
Mar 30 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
DedeCMS 核心类TypeLink.class.php摘要笔记
2010/04/07 PHP
DOM基础及php读取xml内容操作的方法
2015/01/23 PHP
PHP自定义函数实现数组比较功能示例
2017/10/19 PHP
详细解读php的命名空间(二)
2018/02/21 PHP
数据结构之利用PHP实现二分搜索树
2020/10/25 PHP
Gambit vs CL BO3 第二场 2.13
2021/03/10 DOTA
JS对HTML标签select的获取、添加、删除操作
2013/10/17 Javascript
js实现单行文本向上滚动效果实例代码
2013/11/28 Javascript
JS实现屏蔽shift,Ctrl,alt等功能键的方法
2015/06/01 Javascript
Javascript连接Access数据库完整实例
2015/08/03 Javascript
详解angular2封装material2对话框组件
2017/03/03 Javascript
JavaScript调用模式与this关键字绑定的关系
2018/04/21 Javascript
在vue中使用Autoprefixed的方法
2018/07/27 Javascript
详解swiper在vue中的应用(以3.0为例)
2018/09/20 Javascript
详解如何在Javascript和Sass之间共享变量
2019/11/13 Javascript
js获取url页面id,也就是最后的数字文件名
2020/09/25 Javascript
vue3弹出层V3Popup实例详解
2021/01/04 Vue.js
[04:21]狐狸妈带你到现场 DOTA2 TI中国区预选赛线下赛路线指引
2014/05/22 DOTA
python调用java的Webservice示例
2014/03/10 Python
Python多线程、异步+多进程爬虫实现代码
2016/02/17 Python
结合Python的SimpleHTTPServer源码来解析socket通信
2016/06/27 Python
Python测试人员需要掌握的知识
2018/02/08 Python
Python科学计算包numpy用法实例详解
2018/02/08 Python
python添加模块搜索路径和包的导入方法
2019/01/19 Python
关于Python3 lambda函数的深入浅出
2019/11/27 Python
Pytorch框架实现mnist手写库识别(与tensorflow对比)
2020/07/20 Python
完美解决IE8下不兼容rgba()的问题
2017/03/31 HTML / CSS
请问如下代码执行后a和b的值分别是什么
2016/05/05 面试题
拉丁舞学习者的自我评价
2013/10/27 职场文书
书香校园活动方案
2014/02/28 职场文书
工厂门卫的岗位职责
2014/07/27 职场文书
2014年教师节活动总结
2014/08/29 职场文书
2015年乡镇信访工作总结
2015/04/07 职场文书
辅导员学期工作总结
2015/08/14 职场文书
《爬天都峰》教学反思
2016/02/23 职场文书
SQL Server中的游标介绍
2022/05/20 SQL Server