看看Mage_Core_Model_Date::gmtTimestamp()
:
/**
* Forms GMT timestamp
*
* @param int|string $input date in current timezone
* @return int
*/
public function gmtTimestamp($input = null)
{
if (is_null($input)) {
return gmdate('U');
} else if (is_numeric($input)) {
$result = $input;
} else {
$result = strtotime($input);
}
if ($result === false) {
// strtotime() unable to parse string (it's not a date or has incorrect format)
return false;
}
$date = Mage::app()->getLocale()->date($result);
$timestamp = $date->get(Zend_Date::TIMESTAMP) - $date->get(Zend_Date::TIMEZONE_SECS);
unset($date);
return $timestamp;
}
假设$input
为"Today"
假设服务器时区为UTC
。
$date->get(Zend_Date::TIMEZONE_SECS)
对应于商店时区和UTC之间的秒数差异。如果Magento默认存储(我正在从管理员测试)时区iz Pacific/Auckland
(GMT+12)
,则值为43200
。
现在,鉴于Magento正在从通过strtotime
获得的时间戳中减去该差异,显然期望获得的时间戳与商店时区相匹配。但是,它不是,并且通过从GMT时间减去新西兰时差,结果将是GMT-12
,而不是GMT+00
此行为特别影响应用目录规则。如果您查看catalogrule_product_price
,您会看到为当天,前一天和第二天创建了规则条目。但是,由于上面描述的GMT-12
错误,在某些情况下,这些条目将在当天,昨天和前天进行。
这会以下列方式在前端创建问题:在Mage_CatalogRule_Model_Observer::processFrontFinalPrice()
中,$date
值将与NZ时间戳匹配。 ,格林威治标准时间+12,或者在某些情况下,从UTC观察员的位置开始的某一天。由于catalogrule_product_price
中的条目不包含第二天的条目,因此最终将导致无法获取目录规则。
您可以通过在admin。中应用目录规则来触发此代码的执行。
答案 0 :(得分:0)
经过重大测试后,简而言之,您的基本商店时区应该与您的服务器时区相匹配。