Magento如何有效设置时区

Php的date()函数输出的是当前时区的时间,如果php全局设定了时区以该时区为准,如果没有设置,则以系统时区为准。

Magento
设定了后台的TimeZone后,Magento设置
的时区仍然无效,PHP全局时区仍然未改变,Magento全局时区
还是格林威治时区。

所以如果想使用Magento设定时区
的时间,必须明确调用时区,或者通过下面的方法,否则date()显然是不生效的。

$date = Mage::app()->getLocale()->date();
$dStr = $date->toString(Varien_Date::DATETIME_INTERNAL_FORMAT);
//$dStr 可以用于存储到数据库的datetime字段.

上面代码才可以输出当前日期的当前时区时间。
 

对Magento的时间/时区的几点见解

Magento整个系统中使用UTC时间,即通用协调时(UTC, Universal Time Coordinated)。这样保证在不同的视图或者Store里使用的时间与本地时间一致,在系统配置中可以看到,每个视图或者店铺可以单独设置时区

Magento在数据库中存贮的都是UTC时间,在渲染视图的时候会显示当前时间。

如果想在视图中获取当前时间,可以使用如下函数:

Mage::getModel('core/date')->date();

或者在Grid中使用:

        $this->addColumn('customer_since', array(
            'header'    => Mage::helper('customer')->__('Customer Since'),
            //这个是指定该字段是时间字段,在视图输出的时候会自动转成当地时间。
            'type'      => 'datetime',
            'align'     => 'center',
            'index'     => 'created_at',
            'gmtoffset' => true
        ));

提示的一点是在Magento开发中千万别尝试改变 系统时区
,例如在入口文件
index.php或者启动器Mage.php加入date_default_timezone_set这样的函数,不然你会扰 乱整个系统的时间。

date_default_timezone_set('Asia/Shanghai');

下面文章是摘录自百度知道,对时区
的介绍:


每个地区都有自己的本地时间,在网上以及无线电通信
中时间转换
问题
就显得格外突出。我自己就经常混淆于此,特地研究了一 下,记录在此以备忘。

整个地球分为二十四时区
,每个时区
都有自己的本地时间。在国际无线电通信
场合,为了统一起见,使用一个统一的时间,称为通用协调时(UTC, Universal Time Coordinated)。UTC与格林尼治平均时(GMT, Greenwich Mean Time)一样,都与英国伦敦的本地时相同。在本文中,UTC与GMT含义完全相同。

北京时区
是东八区,领先UTC八个小时,在电子邮件
信头的Date域记为+0800。如果在电子邮件
的信头中有这么一行:

Date: Fri, 08 Nov 2002 09:42:22 +0800

说明信件的发送地的地方时间是二○○二年十一月八号,星期五,早上九点四十二分(二十二秒),这个地方的本地时领先UTC八个小时(+0800, 就是东八区时间)。电子邮件
信头的Date域使用二十四小时的时钟,而不使用AM和PM来标记上下午。

以这个电子邮件
的发送时间为例,如果要把这个时间转化为UTC,可以使用一下公式:

UTC + 时区
差 = 本地时间

时区
差东为正,西为负。在此,把东八区时区
差记为 +0800,

UTC + (+0800) = 本地(北京)时间 (1)

那么,UTC = 本地时间(北京时间))- 0800 (2)

0942 – 0800 = 0142

即UTC是当天凌晨一点四十二分二十二秒。如果结果是负数就意味着是UTC前一天,把这个负数加上2400就是UTC在前一天的时间。例如,本地 (北京)时间是 0432 (凌晨四点三十二分),那么,UTC就是 0432 – 0800 = -0368,负号意味着是前一天, -0368 + 2400 = 2032,既前一天的晚上八点三十二分。

纽约的时区
是西五区,比UTC落后五个小时,记为 -0500:

UTC + (-0500) = 纽约时间 (3)

UTC = 纽约时间 + 0500 (4)

把(2)式 - (4)式相比较,

UTC = 北京时间 - 0800 = 纽约时间 + 0500 (5)

即 北京时间 = 纽约时间 + 1300 (6)

即北京时间领先纽约时间十三个小时,由(6)式,

纽约时间 = 北京时间 - 1300 (7)

在四月下旬,纽约又换用夏令时,又称为日光节约时,比标准纽约时间提前一个小时,实际成为西四区的标准时间,成为 -0400。

UTC + (-0400) = 纽约夏令时,套用以上公式,

北京时间 = 纽约夏令时 + 1200

纽约夏令时 = 北京时间 - 1200

在这些转换
中,最重要的公式就是

UTC + 时区
差 = 本地时间

时区
差东为正,西为负。例如,东八区(北京)是 +0800,西五区(纽约)是-0500,加州是西八区,是-0800,美国中部时区
是西六区,-0600,美国山地时区
是西七区,-0700,太平洋时 区是西八区,-0800,在夏天使用夏时制,成为-0700。德国时区
是东一区,+0100,夏天变为+0200。

多数电子邮件
程序,例如Outlook Expres
s,在显示时间时,计算机程序把时间先转换
成为本地时间再显示,例如,邮件的Date域为:

Date: Fri, 08 Nov 2002 09:42:22 +0800

Outlook Expres
s在显示时就显示为:

Date: Thur, 07 Nov 2002 08:42:22 pm,把北京时间转换
成为了纽约时间,而且把二十四小时格式
的时间转换
成为了十二小时的格式
。当然,为了时间转换
正确,发送方和接受方的计算机的时区
都要 设置正确,在这里,发送方的时区
要正确地设为北京时区
东八区,而我的时区
要设为西五区。

php设置时区的两种方法

 

本文来自小屋sjolzy.cn【原创】

 

php5后都要自己设置时区,要么修改php.ini的设置,要么在代码里修改。

 

在PHP.INI中设置时区

date.timezone = PRC

在代码中设置时区

 

1 date_default_timezone_set('Asia/Shanghai');//'Asia/Shanghai'   亚洲/上海

2 date_default_timezone_set('Asia/Chongqing');//其中Asia/Chongqing'为“亚洲/重庆”

3 date_default_timezone_set('PRC');//其中PRC为“中华人民共和国”

4i ni_set('date.timezone','Etc/GMT-8');

5 ini_set('date.timezone','PRC');

6 ini_set('date.timezone','Asia/Shanghai');

7 ini_set('date.timezone','Asia/Chongqing');

 

以上七种方法,任意一个都可以满足我们需求。

系统初始化时,加上

 ini_set('date.timezone','Asia/Shanghai');  或date_default_timezone_set("PRC");  就将解决时区相差8

小时的问题。