2013-02-05 51 views
1

为什么Doctrine不像旧日期?无法将数据库值“1876-01-01 00:00:00-00:00:00”转换为Doctrine类型datetime

Exception was thrown : Could not convert database value "1876-01-01 00:00:00-00:00:00" to Doctrine Type datetime 

而另:

Exception was thrown : Could not convert database value "0000-00-00 00:00:00-00:00:00" to Doctrine Type datetime 

在我的实体我重写datetimedatetimetz

Type::overrideType('datetime', 'Doctrine\DBAL\Types\VarDateTimeType'); 
Type::overrideType('datetimetz', 'Doctrine\DBAL\Types\VarDateTimeType'); 

如果我升级到1976-01-01 00:00:00-00:00:00正常工作的日期。

UPDATE:

所以我运行Ubuntu 12.04 64位,我也知道我有64位time_t的这些测试工作:

的strtotime()32产生不同的输出和64位系统运行 PHP 5.3.3(如前所述)。这会影响“零日期” (“0000-00-00 00:00:00”)以及日期范围之外的日期。

测试:

strtotime("0000-00-00 00:00:00") returns FALSE on a 32 bit system. 
strtotime("0000-00-00 00:00:00") returns -62169955200 on a 64 bit system. 

当执行echo strtotime("0000-00-00 00:00:00");我得到这个:

php time_test.php -62169966000 

所以不会有原则的问题?

+1

一个32位'time_t'值只能1901年底和2038年初为了处理该范围之外的日期之间表示日期,则需要64位'time_t'。直到“世界末日”还有不到25年的时间 - 当基于1970-01-01 00:00:00 +00:00时期的32位'time_t'值耗尽时。 –

+0

@JonathanLeffler在那里我可以设置或告诉教义使用64 time_t? –

+1

根本不知道学说,我不确定。这将是一个编译时问题;你需要一个64位版本的PHP和Doctrine。如果您使用的是32位系统,则可能是卡住了。如果您使用的是64位系统(即硬件是x86_64或其他64位芯片),那么您可能会重建所有64位,并且它可能正常工作。然而,这不是一件小事。 (对于'重建',你可以阅读'重建或下载预建' - 你几乎肯定需要在64位系统上安装64位软件。) –

回答

2

PHP中的时代是1970年或1901年,具体取决于您的系统。

从PHP手册:

时间戳的有效范围通常为星期五,1901年12月13日20时45分54秒 GMT到星期二,2038年1月19日3点14分07秒GMT。 (这些日期为 ,对应于32位有符号整数的最小值和最大值)。但是,在PHP 5.1.0之前,在某些系统(例如Windows)上,该范围从 01-01-1970到19-01-2038被限制。

http://php.net/manual/en/function.date.php

相关问题