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中$this->含义分析
Nov 29 PHP
php实现mysql备份恢复分卷处理的方法
Dec 26 PHP
PHP中使用正则表达式提取中文实现笔记
Jan 20 PHP
php动态生成版权所有信息的方法
Mar 24 PHP
微信自定义菜单的处理开发示例
Apr 16 PHP
PHP错误机制知识汇总
Mar 24 PHP
CodeIgniter集成smarty的方法详解
May 26 PHP
PDO操作MySQL的基础教程(推荐)
Aug 18 PHP
PHP常见字符串操作函数与用法总结
Mar 04 PHP
php apache开启跨域模式过程详解
Jul 08 PHP
laravel框架中控制器的创建和使用方法分析
Nov 23 PHP
PHP如何获取Cookie并实现模拟登录
Jul 16 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
PHP4和PHP5共存于一系统
2006/11/17 PHP
编写php应用程序实现摘要式身份验证的方法详解
2013/06/08 PHP
Yii中的relations数据关联查询及统计功能用法详解
2016/07/14 PHP
PHP页面间传递值和保持值的方法
2016/08/24 PHP
PHP实现图片批量打包下载功能
2017/03/01 PHP
[原创]PHP实现字节数Byte转换为KB、MB、GB、TB的方法
2017/08/31 PHP
PHP-FPM 设置多pool及配置文件重写操作示例
2019/10/02 PHP
php生成HTML文件的类方法
2019/10/11 PHP
javascript操作cookie的文章(设置,删除cookies)
2010/04/01 Javascript
关于 文本框默认值 的操作js代码
2012/01/12 Javascript
引用其它js时如何同时处理多个window.onload事件
2014/09/02 Javascript
jquery常用方法及使用示例汇总
2014/11/08 Javascript
JavaScript学习笔记之定时器
2015/01/22 Javascript
ztree获取当前选中节点子节点id集合的方法
2015/02/12 Javascript
JavaScript AOP编程实例
2015/06/16 Javascript
jquery实现点击变换导航样式的方法
2015/08/31 Javascript
js判断手机浏览器操作系统和微信浏览器的方法
2016/04/30 Javascript
JavaScript的六种继承方式(推荐)
2017/06/26 Javascript
JavaScript之json_动力节点Java学院整理
2017/06/29 Javascript
React + webpack 环境配置的方法步骤
2017/09/07 Javascript
Vue.js划分组件的方法
2017/10/29 Javascript
vue中v-cloak解决刷新或者加载出现闪烁问题(显示变量)
2018/04/20 Javascript
使用nvm和nrm优化node.js工作流的方法
2019/01/17 Javascript
前端插件之Bootstrap Dual Listbox使用教程
2019/07/23 Javascript
Python调用C语言开发的共享库方法实例
2015/03/18 Python
python爬虫获取新浪新闻教学
2018/12/23 Python
flask框架自定义过滤器示例【markdown文件读取和展示功能】
2019/11/08 Python
Aeropostale官网:美国著名校园品牌及青少年服饰品牌
2019/03/21 全球购物
老师推荐信
2013/10/28 职场文书
医院办公室主任职责
2013/12/29 职场文书
管事部库房保管员岗位职责
2014/02/21 职场文书
保送生自荐信范文
2015/03/26 职场文书
2015年评职称工作总结范文
2015/04/20 职场文书
2015年社区精神文明工作总结
2015/05/26 职场文书
男人帮观后感
2015/06/18 职场文书
十大最强岩石系宝可梦,怪颚龙实力最强,第七破坏力很强
2022/03/18 日漫