如何使用TYPO3 extbase fluid正确输出DateTime?

3

我在数据库中存储了两个日期时间对象:

  • 2014年11月03日09:00:00
  • 2014年10月21日13:45:00

当我尝试使用ViewHelper format.date输出它们时

<f:format.date format="H:i">{termin.datumBeginn}</f:format.date>

我得到了以下结果:
  • 10:00
  • 15:45
所以我有一个一小时的转换和一个两小时的转换,我无法编写解决方法。如何正确设置时区以获得干净的输出?

我在这里遇到了类似的问题,输出的时间与我输入的时间不同。你解决了这个问题或找到了解决方法吗? - j4k3
我曾经使用了最不正规的方法,为时间创建了一个简单的输入/字符型字段。 - qualle
4个回答

5

尽管这已经很老了,但我想强调一下直到最近这仍然是Extbase的一个错误。我们在TYPO3 7.6和8中修复了它。日期现在被正确地读取为UTC,并转换为您服务器的时区。


3

确保您数据库中的所有日期都处于同一时区,因为该信息未保存在其中。当您从外部 API 调用中接收某些对象时,它们将具有日期字符串中的时区,并且通常为 UTC。从您的内部调用中,所有 \DateTime 对象将默认使用您服务器的默认时区。因此,在将其保存到数据库之前,请设置时区:

$receivedDate = new \DateTime($date);
$reveivedDate->setTimezone(new \DateTimeZone(date_default_timezone_get()));

将服务器默认时区设为时区很方便,因为无需进行其他更改。但我认为最好将其保存在“UTC”中。在这种情况下,在显示之前需要将其转换回您的服务器/用户时区。可以在ViewHelper中完成此操作(不是Typo3.Fluid中的默认ViewHelper,但是您可以轻松地在包中扩展它-克隆并再次设置时区)。也许现在可以在Flow中使用Doctrine扩展,并将带有日期的时区保存到数据库中。我尝试过一年前,但无法实现。


1
谢谢,但我如何访问存储查询?这是具有IRRE的默认TYPO3后端行为。难道没有任何简单的解决方案吗?我不可能是第一个只想在TYPO3后端存储日期并希望以与使用正常viewHelper f:format保存的方式在前端获取它的人。 - qualle

1
为了解决这个问题,您需要将$TYPO3_CONF_VARS ['SYS'] ['phpTimeZone']设置为“UTC”,将$TYPO3_CONF_VARS ['SYS'] ['serverTimeZone']设置为“0”(可能只需第一个设置即可)。您可以通过typo3后端使用Install工具来完成。如果您有域模型,则可以使用解决方法:
/**
 * Returns the startDate
 *
 * @return \DateTime|NULL $startDate
 */
public function getStartDate() {
    $date = $this->startDate;
    if($date) {
        $date->setTimezone(new \DateTimeZone('UTC'));
    }
    return $date;
}

1
这可能在插入内容后进行是危险的,因为日期不会被移动。 TYPO3 在数据库中存储的日期是在服务器时区中(出于历史原因……)。因此,如果您进行此更改,您需要手动将时间戳转换为 UTC。 - Andreas Wolf

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接