Smarty 设置时区实现方法

Smarty自带的时间格式化(date_format[格式化日期])是比较强大的,其参数甚至可以是MySQL或者Unix的时间戳。不过刚才在使用的时候发现格式化有点小问题:

 代码如下 复制代码

<{$smarty.now|date_format:"%Y-%m-%d %H:%M"}> 

获取到的时间却是:2011-06-24 15:58。而我系统的时间是2011年6月24日 23:58,想必大家都明白了,这是时区设置不正确的原因!

从Smarty手册中没有找到相关设置时区的方法,date_format中给出的全部是格式化时间的东西,没有设置时区的选项。百度了一下才知道可以在实例化Smarty这个类的时候设置时区。其实仔细一想也很简单,毕竟Smarty是PHP写的,而且看过模板相关知识的人应该都知道:模板实际上最后还是include到源PHP文件中,只不过多了一个解析、替换的过程。所以就跟写普通PHP文件设置时区一样,最后会在模板中生效。

 代码如下 复制代码

include ROOT."smarty/Smarty.class.php"; 

date_default_timezone_set('Asia/Shanghai'); //设置时区

$tpl=new Smarty; 

------------------------------------------

想看看Smarty中的时间到底是怎么一回事?那就继续吧...

看看Smarty编译生成的源文件,在对应的地方找到了这一句:

 代码如下 复制代码

<?php echo ((is_array($_tmp=time())) ? 

   $this->_run_mod_handler('date_format', true, $_tmp, "%Y-%m-%d %H:%M") : 

smarty_modifier_date_format($_tmp, "%Y-%m-%d %H:%M")); 

?> 

 

首先用time()将当前的Unix时间戳赋给$_tmp变量,赋值运算返回的应该是布尔类型的数据,这里却判断是否是数组类型,有点搞不懂。看看这个三目运算符,当返回是数组的时候执行$this->_run_mod_handler(),跟进这个方法看到跟插件(plugins)有关,貌似暂时用不上,而且也不知道何时能执行。后面这个smarty_modifier_date_format()才是要看的重点。

 代码如下 复制代码

function smarty_modifier_date_format($string, $format = '%b %e, %Y', $default_date = '') 

    if ($string != '') { //如果时间戳字符串不空,将其格式化

        $timestamp = smarty_make_timestamp($string); 

    } elseif ($default_date != '') { //如果字符串为空,并且默认时间不空,将默认时间格式化

        $timestamp = smarty_make_timestamp($default_date); 

    } else { 

        return; 

    } 

    if (DIRECTORY_SEPARATOR == '\') { 

        $_win_from = array('%D',       '%h', '%n', '%r',          '%R',    '%t', '%T'); 

        $_win_to   = array('%m/%d/%y', '%b', "n", '%I:%M:%S %p', '%H:%M', "t", '%H:%M:%S'); 

        if (strpos($format, '%e') !== false) { 

            $_win_from[] = '%e'; 

            $_win_to[]   = sprintf('%' 2d', date('j', $timestamp)); 

        } 

        if (strpos($format, '%l') !== false) { 

            $_win_from[] = '%l'; 

            $_win_to[]   = sprintf('%' 2d', date('h', $timestamp)); 

        } 

        $format = str_replace($_win_from, $_win_to, $format); 

    } 

    return strftime($format, $timestamp); //这个是最后一步了,将最终的时间戳根据当前的时区再格式化一下

这个函数前部分主要是为了保证通用性的,它根据不同的字符串格式或者是默认的时间来转换成统一的时间戳。用到的就是smarty_make_timestamp()这个函数:

 代码如下 复制代码

function smarty_make_timestamp($string) 

//这里就是为了保证通用性的,对时间字符串进行转化,使其格式统一。下面有注释,这个就不多说了

    if(emptyempty($string)) { 

        // use "now": 

        $time = time(); 

    } elseif (preg_match('/^d{14}$/', $string)) { 

        // it is mysql timestamp format of YYYYMMDDHHMMSS?             

        $time = mktime(substr($string, 8, 2),substr($string, 10, 2),substr($string, 12, 2), 

                       substr($string, 4, 2),substr($string, 6, 2),substr($string, 0, 4));         

    } elseif (is_numeric($string)) { 

        // it is a numeric string, we handle it as timestamp 

        $time = (int)$string;         

    } else { 

        // strtotime should handle it 

        $time = strtotime($string); 

        if ($time == -1 || $time === false) { 

            // strtotime() was not able to parse $string, use "now": 

            $time = time(); 

        } 

    } 

    return $time; 

格式整理好了之后就调用PHP内置的strftime()函数,这个函数根据区域设置格式化本地时间/日期,这里的区域也正是我们之前设置的时区。整个过程应该是这样的了

时间: 2024-10-31 02:03:18

Smarty 设置时区实现方法的相关文章

PHP中设置时区方法小结_php技巧

找到原因后,在网上搜索到了一些关于PHP的时区设置方法: 1.修改php.ini,在php.ini中找到data.timezone =去掉它前面的;号,然后设置data.timezone = "Asia/Shanghai";即可. 2.在程序PHP 5以上版本的程序代码中使用函数ini_set('date.timezone','Asia/Shanghai');或者date_default_timezone_set('Asia/Shanghai'); 一些常用的时区标识符说明: Asia

Linux 设置系统时间和时区的方法

1 设置时间为22点54分54秒 date -s 22:54:54 2 设置日期为2015年12月13日 date -s 12/13/15 3.设置时区 tzselect 然后选择亚洲 输入5回车 然后再选择中国 输入9回车 再选择east China – Beijing, Guangdong, Shanghai, etc. 输入1回车 最后输入命令 TZ='Asia/Shanghai'; export TZ 才会使得时区生效 修改设置时区 方法(1) tzselect 方法(2) 仅限于Red

php设置时区方法介绍

在 php.ini 中,默认是 date.timezone = UTC.修改为中国时区,修改为 date.timezone = PRC.如果直接写 GMT 格式的,是 date.timezone = Etc/GMT+8. 另外,也可以在 PHP 页面头中设置.  代码如下 复制代码 date_default_timezone_set('PRC'); 在PHP5中, 有很多方法可以设置或者获取默认的时区设置,例如,使用date_default_timezone_setl函数来设置时区  代码如下

php设置时区方法详解介绍

能修改php.ini.打开php.ini查找date.timezone 去掉前面的分号= 后面加XXX,重启http服务(如apache2或iis等)即可 关于XXX,大陆内地可用的值是:Asia/Chongqing ,Asia/Shanghai ,Asia/Urumqi (依次为重庆,上海,乌鲁木 在php.ini中设置时区  代码如下 复制代码 date.timezone = PRC 在代码中设置时区  代码如下 复制代码 date_default_timezone_set('Asia/Sh

PHP中设置时区方法总结

方法一,在php页面设置时区 在页面最前面加上下面应用一种都是可以的 date_default_timezone_set用法如下 date_default_timezone_set (PHP 5 >= 5.1.0RC1) date_default_timezone_set -- 设定用于一个脚本中所有日期时间函数的默认时区 说明 bool date_default_timezone_set ( string timezone_identifier ) date_default_timezone_

Linux下修改时间时区的方法介绍

  以前一直用date设置,这次参考网上资料,终于整了个全的. Linux时钟分为系统时钟(System Clock)和硬件(Real Time Clock,简称RTC)时钟.系统时钟是指当前Linux Kernel中的时钟,而硬件时钟则是主板上由电池供电的时钟,这个硬件时钟可以在BIOS中进行设置.当Linux启动时,硬件时钟会去读取系统时钟的设置,然后系统时钟就会独立于硬件运作. Linux中的所有命令 (包括函数)都是采用的系统时钟设置.在Linux中,用于时钟查看和设置的命令主要有dat

PHP Smarty模版简单使用方法_php实例

本文实例讲述了PHP Smarty模版简单使用方法.分享给大家供大家参考,具体如下: Index.php: require('../libs/Smarty.class.php'); $smarty = new Smarty; // 添加自定义调节器 $smarty->registerPlugin("modifier", "e", "htmlspecialchars"); $smarty->registerPlugin("mo

LNMP系列教程之四:设置301重定向方法

有些朋友要说了,为什么wordpress不需要设置,因为程序的特殊性,我们在建立博客的时候选择是带有WWW或者不带WWW的,然后另外一个会自动内部重定向.     如果你是其他程序就需要手工设置.具体方法如下:     第一步,在我们VPS中的 /usr/local/nginx/conf/vhost/下,我们会看到自己网站的域名命名的CONF文件,然后可以VI命令修改,也可以用FTP下载到本地修改再传上去:     server_name www.3lian.com 3lian.com; if

讯飞输入法手机版设置键盘高度方法

  讯飞输入法手机版设置键盘高度方法          首先,为了设置方便,我们打开一个聊天窗口,点击输入即可弹出讯飞输入法键盘; 讯飞输入法 然后我们点击讯飞输入法键盘左上角的如图所示按钮 ,在打开的页面中我们点击页面右下角的设置; 讯飞输入法 我们点击键盘高度,如图所示; 我们拖动页面上的图标调整页面的高度,然后点击完成即可设置成功了; 讯飞输入法 设置完成后的界面如图所示.