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 相关文章推荐
什么是MVC,好东西啊
May 03 PHP
php中文字母数字验证码实现代码
Apr 25 PHP
PHP 函数学习简单小结
Jul 08 PHP
PHP中改变图片的尺寸大小的代码
Jul 17 PHP
xss防御之php利用httponly防xss攻击
Mar 21 PHP
php使用function_exists判断函数可用的方法
Nov 19 PHP
PHP使用memcache缓存技术提高响应速度的方法
Dec 26 PHP
Symfony2获取web目录绝对路径、相对路径、网址的方法
Nov 14 PHP
PHP+Mysql无刷新问答评论系统(源码)
Dec 20 PHP
PHP递归实现文件夹的复制、删除、查看大小操作示例
Aug 11 PHP
浅谈php的TS和NTS的区别
Mar 13 PHP
YII2框架中behavior行为的理解与使用方法示例
Mar 13 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中的str_repeat函数在JavaScript中的实现
2013/09/16 PHP
php模拟服务器实现autoindex效果的方法
2015/03/10 PHP
PHP使用递归方式列出当前目录下所有文件的方法
2015/06/02 PHP
php获取英文姓名首字母的方法
2015/07/13 PHP
php中简单的对称加密算法实现
2017/01/05 PHP
php中yar框架实例用法讲解
2020/12/27 PHP
JavaScript 嵌套函数指向this对象错误的解决方法
2010/03/15 Javascript
利用google提供的API(JavaScript接口)获取网站访问者IP地理位置的代码详解
2010/07/24 Javascript
EXTJS FORM HIDDEN TEXTFIELD 赋值 使用value不好用的问题
2011/04/16 Javascript
使用基于jquery的gamequery插件做JS乒乓球游戏
2011/07/31 Javascript
JS在textarea光标处插入文本的小例子
2013/03/22 Javascript
JavaScript利用构造函数和原型的方式模拟C#类的功能
2014/03/06 Javascript
js实现ifram取父窗口URL地址的方法
2015/02/09 Javascript
Bootstrap Validator 表单验证
2016/07/25 Javascript
详解Javascript函数声明与递归调用
2016/10/22 Javascript
Vue.js一个文件对应一个组件实践
2016/10/27 Javascript
JS实现探测网站链接的方法【测试可用】
2016/11/08 Javascript
ajax级联菜单实现方法实例分析
2016/11/28 Javascript
微信小程序 底部导航栏目开发资料
2016/12/05 Javascript
jQuery中用on绑定事件时需注意的事项
2017/03/19 Javascript
nodejs集成sqlite使用示例
2017/06/05 NodeJs
Bootstrap模态框插入视频的实现代码
2017/06/25 Javascript
微信小程序 动态修改页面数据及参数传递过程详解
2019/09/27 Javascript
使用Python对Access读写操作
2017/03/30 Python
Python遍历文件夹和读写文件的实现方法
2017/05/10 Python
python爬虫 爬取超清壁纸代码实例
2019/08/16 Python
python 申请内存空间,用于创建多维数组的实例
2019/12/02 Python
Python tkinter界面实现历史天气查询的示例代码
2020/08/23 Python
以色列的身体护理及家居香薰品牌:Sabon NYC
2018/02/23 全球购物
巴西葡萄酒商店:Divvino
2020/02/22 全球购物
EJB实例的生命周期
2016/10/28 面试题
大学生实习证明范本
2014/01/15 职场文书
船舶工程技术专业求职信
2014/08/07 职场文书
服装区域经理岗位职责
2015/04/10 职场文书
nginx搭建图片服务器的过程详解(root和alias的区别)
2021/03/31 Servers
德劲DE1102数字调谐收音机机评
2022/04/07 无线电