我有一个名为&#34的DateTime列的模型; fromDate":
/**
* fromDate
*
* @var \DateTime
*/
protected $fromDate;
现在我需要这个日期来做一些计算,但是当我尝试输出它时,它似乎正好关闭了1个小时。
echo $model->getFromDate()->format('Y-m-d H:i:s');
这将返回2016-02-11 01:00:00而不是2016-02-11 00:00:00
我检查了我的服务器时区,date_default_timezone_get()返回"欧洲/柏林" (哪个是对的)。我试图改变typo3 serverTimeZone(我试过0和1,但没有改变任何东西)。
如果我用phpmyadmin查看数据库,则输入为" 2016-02-11 00:00:00"
我错过了什么,为什么会这样?任何提示?因为我觉得我疯了,一个巨大的计算脚本是基于$ fromDate的正确性...任何帮助将不胜感激。谢谢!
答案 0 :(得分:0)
尝试类似
的内容$myDate = $model->getFromDate();
$myDate->setTimezone(new \DateTimeZone('UTC'));
或您在原始数据库表值中使用的任何时区,如果不是UTC。
在TYPO3 6.2中,至少在您的存储库中执行findAll()
会开始一系列调用 - 到\TYPO3\CMS\Extbase\Persistence\Repository->createQuery()
,然后到\TYPO3\CMS\Extbase\Persistence\Generic\QueryResult->rewind()
。 rewind()
调用initialize()
,调用\TYPO3\CMS\Extbase\Persistence\Generic\Mapper->map()
。 map()
调用mapSingleRow()
,然后在同一个班级中调用thawProperties()
。
TYPO3\CMS\Extbase\Persistence\Generic\Mapper->thawProperties()
具有基于每种属性数据类型的“切换案例”代码部分。如果类型是DateTime,thawProperties()
会在同一个类中调用mapDateTime()
。
mapDateTime()
假设“本机日期/日期时间值以UTC格式存储”,因此它将“UTC”DateTimeZone应用于原始值。但是,mapDateTime()
应用PHP date_default_timezone_get()函数中的DateTimeZone,并将更改的日期和时区属性值返回到thawProperties()
,最终返回到您的Extbase扩展。
您可以在TYPO3 6.2 API reference for mapDateTime()和its definition in DataMapper.php中找到详细信息。
我的回答与this StackOverflow answer,this TYPO3 Forum thread和this TYPO3 Forum thread有关。
答案 1 :(得分:0)
这是Extbase的DateTime处理中的问题,最近针对TYPO3 7.6和8(日期未被解释为UTC)进行了修复。我们不会正式回溯6.2的修复程序,但您当然可以自己应用它。
如果您不想修补核心,您还可以为相关部分(DataMapper
)创建扩展类并覆盖方法(mapDateTime()
)。