在Magento中,我有一个phtml,它迭代了一个继承自Mage_Core_Model_Abstract的自定义模型的集合。该模型有一个名为“date”的DB字段。
当phtml将浏览器的getDate()函数输出显示给浏览器时,它会迭代,大部分时间显示正确的日期。对于不明确的日期(可以解释为M / d / Y或d / M / Y的日期,它确实是错误的。我在MySQL表中检查了日期字段(日期时间),所有日期都正确存储。用PHP中的东西是一旦从日期数据库中读取日期,就会将日期解释错误。
例如:
In MySQL => HTML Output => status
2013-12-05 00:00:00 => 5/12/2013 => Wrong
2013-11-30 00:00:00 => 11/30/2013 => Correct
2013-11-06 00:00:00 => 6/11/2013 => Wrong
2013-10-11 00:00:00 => 11/10/2013 => Wrong
etc.
我已经完成谷歌搜索并查看StackOverflow,但我不确定如何解决此问题。有任何想法吗? 感谢。
更新:
我在集合上使用了printLogQuery(true)来获取它正在执行的查询。它很简单:SELECT main_table
。* FROM physicians_event
AS main_table
;
详细介绍日期从数据库到HTML的方式: 在一个phtml中,我迭代一个自定义集合:
<?php foreach ($this->getEventCollection() as $_event): ?>
<?php echo $this->getLayout()->createBlock('physicians/event')
->setEvent($_event)
->setTemplate('physicians/event/row.phtml')
->toHtml() ?>
<?php endforeach ?>
getEventCollection看起来像这样:
public function getEventCollection() {
if ($this->getSortBy() === null) {
$this->setSortBy('date');
}
if ($this->getLimit() === null) {
$this->setLimit(10);
}
$collection = Mage::getModel('physicians/event')->getCollection();
$collection->setOrder($this->getSortBy())
->setPageSize($this->getLimit());
if ($this->getEventType() !== null) {
$collection->addFieldToFilter('type', array('eq' => $this->getEventType()));
}
return $collection;
}
当所有内容都以HTML格式输出(为集合中的每个项目呈现的row.phtml)时,日期输出如下:
<?php echo $this->getEvent()->getFormattedDate('M/d/Y') ?>
getFormattedDate函数如下所示:
public function getFormattedDate($format = null, $puredate=false) {
$date = new Zend_Date($this->getDate());
if ($format === null) {
$format = 'MMMM d, Y';
}
return (!$puredate)?$date->toString($format):$date;
}
我相信这是迄今为止的全部故事。想法? 再次感谢你!
更新:进一步调试。在getFormattedDate中,我添加了输出语句来跟踪数据出错的地方:
echo "Collection Item Date: " . var_export($this->getDate()) . "<br/>\n";
$date = new Zend_Date($this->getDate());
echo "Zend Item Date: " . var_export($date,true) . "<br/>\n";
输出看起来像这样:
Collection Item Date: '2013-07-06 00:00:00'
Zend Item Date: Zend_Date::__set_state(array(
'_locale' => 'en_US',
'_fractional' => 0,
'_precision' => 3,
'_unixTimestamp' => '1370563200',
'_timezone' => 'UTC',
'_offset' => 0,
'_syncronised' => 0,
'_dst' => false,
))
两个项目都正确2013年7月6日。我想它后来在代码中搞砸了。追踪继续......
我补充说:
echo "<pre>" . var_export($date->toString($format),true) . "</pre><br />\n";
这产生了:'6/7/2013',这是错误的。所以问题在于$ date-&gt; toString($ format)如何操作...
我现在正在这里看看发生了什么:http://framework.zend.com/manual/1.12/en/zend.date.constants.html#zend.date.constants.selfdefinedformats
答案 0 :(得分:2)
我解决了这个问题!!!
问题在于:
$date = new Zend_Date($this->getDate());
它不喜欢将DB Model的日期传递给Zend_Date构造函数。 Zend_Date错误地解释了它。在阅读Zend_Date上的文档后,我了解到它更喜欢unix时间戳。
我在getFormatted Date中将该行更改为如下所示:
$date = new Zend_Date(strtotime($this->getDate()));
现在所有日期都正常工作!