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,把北京时间转换 成为了纽约时间,而且把二十四小时格式 的时间转换 成为了十二小时的格式 。当然,为了时间转换 正确,发送方和接受方的计算机的时区 都要 设置正确,在这里,发送方的时区 要正确地设为北京时区 东八区,而我的时区 要设为西五区。
---
Magento日期及时间函数
Magento日期相关的方法主要在两个文件中。一个是core/date模型类,另外一个是core核心助手类。包含的相关方法如下。
例子
Mage::getSingleton('core/date')
Mage::getSingleton('core/date')->timestamp( $input )获取指定日期的时间戳。若参数为空则获取当前时间戳。
这里返回的时间实际上是 GMT 时间与后台 Timezone 设置所指定时区的计算结果。
Mage::getSingleton('core/date')->gmtTimestamp( $input )获取当前 GMT 时间戳。若参数为空则获取当前 GMT 时间戳。
Mage::getSingleton('core/date')->date( $format, $input )
获取指定格式及时间戳的日期时间。若 $format 为空则格式为 Y-m-d H:i:s;若 $input 为空则返回当前时间。
这里返回的时间实际上是 GMT 时间与后台 Timezone 设置所指定时区的计算结果。
Mage::getSingleton('core/date')->gmtDate( $format, $input )获取指定格式及时间戳的 GMT 日期时间。若 $format 为空则格式为 Y-m-d H:i:s;若 $input 为空则返回当前 GMT 时间。
一般来说,实际应用中用于直接显示的时间都使用:
Mage::getSingleton('core/date')->date( $format )等价于
Mage::getSingleton('core/date')->date( $format, Mage::getSingleton('core/date')->gmtTimestamp() )
而用于储存在数据库的时间应该使用 GMT 时间,以保证每次读取的时间都不受时区设置所影响
Mage::getSingleton('core/date')->gmtDate( 'Y-m-d H:i:s' )
显示时可作为 $input 参数直接使用 date 方法:
Mage::getSingleton('core/date')->date( 'Y-m-d H:i:s', Mage::getSingleton('core/date')->gmtDate( 'Y-m-d H:i:s' ) )
补充:
1,core/date,主要的方法就是date,实际上就是简单对PHP中date()函数的封装。定义如下。
/**
* Converts input date into date with timezone offset
* Input date must be in GMT timezone
*
* @param string $format
* @param int|string $input date in GMT timezone
* @return string
*/
public function date($format = null, $input = null)
{
if (is_null($format)) {
$format = 'Y-m-d H:i:s';
}
$result = date($format, $this->timestamp($input));
return $result;
}使用举例,date()参数为空时,默认参一为Y-m-d H:i:s,参二为当前时间戳。
Mage::getModel('core/date')->date(); //2013-01-09 23:16:10
Mage::getModel('core/date')->date('Y-m-d'); //2013-01-09
$anyDate = '2013-01-09';
Mage::getModel('core/date')->date('d.m.Y', strtotime($anyDate)); //09.01.20132,核心助手类formatDate方法,该方法定义如下。
/**
* Format date using current locale options and time zone.
*
* @param date|Zend_Date|null $date
* @param string $format See Mage_Core_Model_Locale::FORMAT_TYPE_* constants
* @param bool $showTime Whether to include time
* @return string
*/
public function formatDate($date = null, $format = Mage_Core_Model_Locale::FORMAT_TYPE_SHORT, $showTime = false)
{
if (!in_array($format, $this->_allowedFormats, true)) {
return $date;
}
if (!($date instanceof Zend_Date) && $date && !strtotime($date)) {
return '';
}
if (is_null($date)) {
$date = Mage::app()->getLocale()->date(Mage::getSingleton('core/date')->gmtTimestamp(), null, null);
} else if (!$date instanceof Zend_Date) {
$date = Mage::app()->getLocale()->date(strtotime($date), null, null);
}
if ($showTime) {
$format = Mage::app()->getLocale()->getDateTimeFormat($format);
} else {
$format = Mage::app()->getLocale()->getDateFormat($format);
}
return $date->toString($format);
}实例演示,参数二支持4个参数,如下所示,参数三为true时,则输出包含当前时间。
$dateToFormat = '2013-01-09';
Mage::helper('core')->formatDate($dateToFormat, 'full', false); //Tuesday, January 9, 2013
Mage::helper('core')->formatDate($dateToFormat, 'long', false); //January 9, 2013
Mage::helper('core')->formatDate($dateToFormat, 'medium', false); //Jan 9, 2013
Mage::helper('core')->formatDate($dateToFormat, 'short', false); //1/9/13