代码说

code is poetry

代码说    
碎碎念:己所不欲勿施于人,己所欲亦勿施于人。  换一换

emlog系统对时间的处理

作者:coderzheng 发布于:2016-5-6 10:25 Friday 分类:other  阅读模式

emlog系统能保证当应用程序部署在世界各地不同地理位置上的服务器上时,页面显示的时间始终和用户当地时区一致。来看一下实现方法,和时间处理的地方主要有两个,一个是后台创建编辑文章页面,一个是归档页面(按照时间年月显示归档)。先来看文章创建和编辑的页面,下面是截取admin/write_log.php的部分代码段:
//显示撰写日志页面
if ($action == '') {
     $Tag_Model = new Tag_Model();
     $Sort_Model = new Sort_Model();

     $sorts = $Sort_Model->getSorts();
     $tags = $Tag_Model->getTag();

     $localtime = time() + Option::get('timezone') * 3600;
     $postDate = gmdate('Y-m-d H:i:s', $localtime);

     include View::getView('header');
     require_once View::getView('add_log');
     include View::getView('footer');
     View::output();
}
可以看出,获取时间的最后一步统一使用的是gmdate函数。这个函数和date有什么区别呢?
简单说就是gmdate不受程序中时区设置的影响,而date会。换句话说,date会自动找寻当前php环境的date.timezone的值,然后根据这个值自动调整输出。
因此,在后台日志编辑/提交页面,只要我们在处理时间时,总是遵循"使用gmdate函数 + 根据用户自定义时区进行调整"的策略,系统显示给用户的时间就会是用户期望看到的时间。当然前提是,gmdate总是接受time()的返回值作为参数(因为time()不受时区设置的影响,在任何机器上都是得到同样的值!)。但是如果gmdate不是处理当前时间呢? 在归档页面,一个典型的字符串格式的时间就像这样:201508。我们第一时间想到的是使用strtotime这个函数,但是很不幸,这个函数也受时区的影响。这时候情况就稍显复杂了,emlog系统自定义函数emStrtotime来进行处理,来看这个函数的实现:

为了方便读者理解,请看流程图:

至此,我们已经将emlog系统处理时间的所有技巧讲述完了。




<全文完>

标签: emlog

你可以发表评论、引用到你的网站或博客,或通过RSS 2.0订阅这个博客的所有文章。
上一篇: 记一次转换思维的尝试  |  下一篇:给大家介绍一款轻巧的图片编辑器