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 相关文章推荐
杏林同学录(八)
Oct 09 PHP
apache mysql php 源码编译使用方法
May 03 PHP
深入密码加salt原理的分析
Jun 06 PHP
php从给定url获取文件扩展名的方法
Mar 14 PHP
php快速查找数据库中恶意代码的方法
Apr 01 PHP
php图片水印添加、压缩、剪切的封装类实现
Apr 18 PHP
php处理复杂xml数据示例
Jul 11 PHP
PHP实现批量删除(封装)
Apr 28 PHP
PHP通过curl获取接口URL的数据方法
May 31 PHP
详解php中curl返回false的解决办法
Mar 18 PHP
laravel框架数据库配置及操作数据库示例
Oct 10 PHP
yii 框架实现按天,月,年,自定义时间段统计数据的方法分析
Apr 04 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源代码数组统计count分析
2011/08/02 PHP
php简单实现sql防注入的方法
2016/04/22 PHP
Yii框架学习笔记之应用组件操作示例
2019/11/13 PHP
javascript preload&lazy load
2010/05/13 Javascript
动态加载JS文件的三种方法
2013/11/08 Javascript
Node.js环境下JavaScript实现单链表与双链表结构
2016/06/12 Javascript
JavaScript 数组- Array的方法总结(推荐)
2016/07/21 Javascript
JavaScript提高网站性能优化的建议(二)
2016/07/24 Javascript
js表单登陆验证示例
2016/10/19 Javascript
JavaScript获取服务器端时间的方法
2016/11/29 Javascript
Vue.js中用webpack合并打包多个组件并实现按需加载
2017/02/17 Javascript
老生常谈jquery中detach()和remove()的区别
2017/03/02 Javascript
WebSocket实现简单客服聊天系统
2017/05/12 Javascript
BootStrap Table实现server分页序号连续显示功能(当前页从上一页的结束序号开始)
2017/09/12 Javascript
React Native使用百度Echarts显示图表的示例代码
2017/11/07 Javascript
基于cropper.js封装vue实现在线图片裁剪组件功能
2018/03/01 Javascript
区别JavaScript函数声明与变量声明
2018/09/12 Javascript
微信小程序JS加载esmap地图的实例详解
2019/09/04 Javascript
Python break语句详解
2014/03/11 Python
python开发之str.format()用法实例分析
2016/02/22 Python
Python利用Django如何写restful api接口详解
2018/06/08 Python
python 解决动态的定义变量名,并给其赋值的方法(大数据处理)
2018/11/10 Python
python基础知识(一)变量与简单数据类型详解
2019/04/17 Python
Flask框架单例模式实现方法详解
2019/07/31 Python
Python3.5 win10环境下导入kera/tensorflow报错的解决方法
2019/12/19 Python
关于tensorflow softmax函数用法解析
2020/06/30 Python
IE浏览器单独写CSS样式的几种方法
2014/10/14 HTML / CSS
傲盾软件面试题
2015/08/17 面试题
数学高效课堂实施方案
2014/03/29 职场文书
学生打架检讨书
2014/10/20 职场文书
老干部工作汇报材料
2014/10/28 职场文书
社区党员群众路线教育实践活动心得体会
2014/11/03 职场文书
初三学生语文考试作弊检讨书
2014/12/14 职场文书
幼儿园小朋友毕业感言
2015/07/30 职场文书
Java集成swagger文档组件
2021/06/28 Java/Android
nodejs利用readline提示输入内容实例代码
2021/07/15 NodeJs