Magento错误地从MySQL显示日期

时间:2013-08-16 20:51:22

标签: magento date time

在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;
}

当所有内容都以HT​​ML格式输出(为集合中的每个项目呈现的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

1 个答案:

答案 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()));

现在所有日期都正常工作!

相关问题