PHP+;条令ORM-带有日期时间的实体>;2069
我有一个从oracle数据库获取日期时间的实体。在某些情况下(事实上经常如此,我无法影响),它们是2099年12月31日。 这是1999年12月31日在Symfony返回的 我怎样才能解决这个问题?有没有办法扩展PHP日期时间?或者扩展datetime类型 也许有一种简单的方法可以用细枝过滤器检查日期,如果小于2000年,可以增加1000年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
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年。感谢您的回答,我如何检查?查询是按条令进行的,我看不到原始输出:-(