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 - Html Transfer Code
Oct 09 PHP
PHP 和 MySQL 基础教程(一)
Oct 09 PHP
php simplexmlElement操作xml的命名空间实现代码
Jan 04 PHP
web站点获取用户IP的安全方法 HTTP_X_FORWARDED_FOR检验
Jun 01 PHP
解析php时间戳与日期的转换
Jun 06 PHP
php针对cookie操作的队列操作类实例
Dec 10 PHP
php获取QQ头像并显示的方法
Dec 23 PHP
php生成二维码
Aug 10 PHP
Linux安装配置php环境的方法
Jan 14 PHP
浅析Yii2缓存的使用
May 10 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
Nov 14 PHP
php实现大文件断点续传下载实例代码
Oct 01 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单一接口的实现方法
2015/06/20 PHP
ThinkPHP3.2.3框架Memcache缓存使用方法实例总结
2019/04/15 PHP
用于判断用户注册时,密码强度的JS代码
2009/01/01 Javascript
javaScript parseInt字符转化为数字函数使用小结
2009/11/05 Javascript
js弹出模式对话框,并接收回传值的方法
2013/03/12 Javascript
如何让DIV可编辑、可拖动示例代码
2013/09/18 Javascript
Jquery validation remote 验证的缓存问题解决方法
2014/03/25 Javascript
jQuery中removeClass()方法用法实例
2015/01/05 Javascript
js实现文字垂直滚动和鼠标悬停效果
2015/12/31 Javascript
JavaScript入门教程之引用类型
2016/05/04 Javascript
深入浅析JS Function()构造函数
2016/08/22 Javascript
AngularJs bootstrap搭载前台框架——js控制部分
2016/09/01 Javascript
Vue.Draggable实现拖拽效果
2020/07/29 Javascript
浅谈es6中export和export default的作用及区别
2018/02/07 Javascript
使用Vue如何写一个双向数据绑定(面试常见)
2018/04/20 Javascript
解决eclipse中没有js代码提示的问题
2018/10/10 Javascript
使用vue完成微信公众号网页小记(推荐)
2019/04/28 Javascript
js中script的上下放置区别,Dom的增删改创建操作实例分析
2019/12/16 Javascript
vue项目中监听手机物理返回键的实现
2020/01/18 Javascript
toString.call()通用的判断数据类型方法示例
2020/08/28 Javascript
如何在Python中编写并发程序
2016/02/27 Python
python实现冒泡排序算法的两种方法
2018/03/10 Python
Python+Pyqt实现简单GUI电子时钟
2021/02/22 Python
Python通过字典映射函数实现switch
2020/11/06 Python
基于PyTorch中view的用法说明
2021/03/03 Python
英国著名的药妆网站:Escentual
2016/07/29 全球购物
红色康乃馨酒店:Red Carnation Hotels
2017/06/22 全球购物
HelloFresh澳大利亚:订购你的美味食品盒、健康餐食
2018/03/28 全球购物
美国在线宠物商店:Chewy
2019/01/12 全球购物
幸福家庭事迹材料
2014/02/03 职场文书
献爱心捐款倡议书
2014/05/14 职场文书
机械专业求职信
2014/05/25 职场文书
优秀党员先进材料
2014/12/18 职场文书
六年级语文教学反思
2016/03/03 职场文书
简单且有用的Python数据分析和机器学习代码
2021/07/02 Python
springboot 全局异常处理和统一响应对象的处理方式
2022/06/28 Java/Android