Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP+;条令ORM-带有日期时间的实体>;2069_Php_Oracle_Symfony_Datetime_Doctrine Orm - Fatal编程技术网

PHP+;条令ORM-带有日期时间的实体>;2069

PHP+;条令ORM-带有日期时间的实体>;2069,php,oracle,symfony,datetime,doctrine-orm,Php,Oracle,Symfony,Datetime,Doctrine Orm,我有一个从oracle数据库获取日期时间的实体。在某些情况下(事实上经常如此,我无法影响),它们是2099年12月31日。 这是1999年12月31日在Symfony返回的 我怎样才能解决这个问题?有没有办法扩展PHP日期时间?或者扩展datetime类型 也许有一种简单的方法可以用细枝过滤器检查日期,如果小于2000年,可以增加1000年 DateTime {#989 ▼ +"date": "1999-12-31 00:00:00.000000" +"timezone_type": 3

我有一个从oracle数据库获取日期时间的实体。在某些情况下(事实上经常如此,我无法影响),它们是2099年12月31日。 这是1999年12月31日在Symfony返回的

我怎样才能解决这个问题?有没有办法扩展PHP日期时间?或者扩展datetime类型

也许有一种简单的方法可以用细枝过滤器检查日期,如果小于2000年,可以增加1000年

DateTime {#989 ▼
  +"date": "1999-12-31 00:00:00.000000"
  +"timezone_type": 3
  +"timezone": "Europe/Berlin"
}
我知道我可以用to_char()手动获取它,但这不是一个选项

一些信息:

  • PHP7.1.0
  • Symfony 3.2.6
  • 小枝
  • 甲骨文12g
提前谢谢,对于任何语言错误,我都深表歉意,我不是以英语为母语的人:-)

编辑:

这是我的日期字段

 /**
 * @ORM\Column(name="VALIDTO" , type="datetime")
 */
protected $validTo;
编辑2: 我的服务器是Linux主机名3.10.0-229.14.1.el7.x86#u 64#1 SMP周二9月15日15:05:51 UTC 2015 x86_64


我的php使用了所有的lib64文件,它应该是64位:-)

我的第一个想法是31-Dec-2099超出了32位有符号整数的范围。从手册中:

时间戳的有效范围通常是从1901年12月13日星期五20:45:54 UTC到2038年1月19日星期二03:14:07 UTC。(这些是日期 对应于32位有符号字符串的最小值和最大值 此外,并非所有平台都支持负时间戳

但是,Symfony/Doctrine必须检查这一点,然后减去100年以使其符合要求。我不确定他们是否在自己的代码中这么做了——这是可能的。此外,您的服务器必须是32位而不是64位

有没有办法扩展PHP日期时间

oracledocs()推荐一个旧的PHP-Pear库,它就是这样做的

或者扩展datetime类型

实体中的条令映射是否为日期时间?你打字是暗示日期时间吗?如果这些都签出,是否存在相关错误

还有什么要检查的。你是在克隆日期,而不是仅仅根据原始日期工作吗?例如,如果您有:

$date = //get the date from your entity/repository
$date->modify('+some modification');
$newDate = $date //rather than $newDate = new \DateTime($date);

这也会产生意想不到的结果

我终于找到了解决办法!timclutton是对的。。。我以字符串形式查询了日期,并从数据库中获得了31-12-99

解决方案是添加一个事件侦听器

 my.oracle.listener:
        class: Doctrine\DBAL\Event\Listeners\OracleSessionInit
        tags:
            - { name: doctrine.event_listener, event: postConnect, connection: default }
设置会话的正确NLS日期格式。我终于把我的约会安排妥当了


谢谢你们的帮助

谢谢你的回答,我根本不操纵数据。如果我查询实体,日期字段如上所示。据我所知,PHP版本5.1中删除了范围限制“然而,在PHP 5.1.0之前,在某些系统(例如Windows)上,该范围从1970年1月1日限制到2038年1月19日。”,如果您的服务器不是32位系统,并且您根本没有事先处理日期,那么我会说Timclutton的回答:某种格式问题,YYYY变为YY。请检查从Oracle返回的日期格式。通常是类似于
DD-MON-RR
(例如
31-DEC-99
),PHP会将其解释为1999年,而不是2099年。感谢您的回答,我如何检查?查询是按条令进行的,我看不到原始输出:-(