【问题标题】:PHP + Doctrine ORM - Entity with Datetime > 2069PHP + Doctrine ORM - 日期时间 > 2069 的实体
【发布时间】:2017-08-14 09:30:38
【问题描述】:

我有一个从 oracle 数据库中获取日期时间的实体。在某些情况下(实际上很多时候,我无法影响)它们是 2099 年 12 月 31 日。 这在 Symfony 中返回为 31-Dec-1999。

我该如何解决?有没有办法扩展 PHP Datetime ?或者扩展 Doctrine datetime 类型?

也许有一种平滑的方法可以使用 twig 过滤器检查日期并在其

DateTime {#989 ▼
  +"date": "1999-12-31 00:00:00.000000"
  +"timezone_type": 3
  +"timezone": "Europe/Berlin"
}

我知道我可以使用 to_char() 手动获取它,但这不是一个选项。

一些信息:

  • PHP 7.1.0
  • Symfony 3.2.6
  • 树枝
  • Oracle 12g

提前致谢,对任何语言错误深表歉意,我不是母语人士 :-)

编辑:

这是我的 Enitiy 字段的日期

 /**
 * @ORM\Column(name="VALIDTO" , type="datetime")
 */
protected $validTo;

编辑 2: 我的服务器是 Linux 主机名 3.10.0-229.14.1.el7.x86_64 #1 SMP Tue Sep 15 15:05:51 UTC 2015 x86_64

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

【问题讨论】:

  • 检查从 Oracle 返回的日期格式。通常它会类似于DD-MON-RR(例如31-DEC-99),PHP 会将其解释为 1999,而不是 2099。
  • 感谢您的回答,我该如何检查?查询是由学说完成的,我看不到原始输出:-(

标签: php oracle symfony datetime doctrine-orm


【解决方案1】:

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

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

 my.oracle.listener:
        class: Doctrine\DBAL\Event\Listeners\OracleSessionInit
        tags:
            - { name: doctrine.event_listener, event: postConnect, connection: default }

OracleSessionInit 为会话设置正确的 NLS 日期格式。我终于得到了正确格式的日期!

谢谢大家的帮助!

【讨论】:

    【解决方案2】:

    我的第一个想法是 2099 年 12 月 31 日超出了 32 位有符号整数的范围。来自手册:http://php.net/manual/en/function.strtotime.php

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

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

    有没有办法延长 PHP 日期时间?

    Oracle 文档 (http://www.oracle.com/technetwork/articles/fuecks-dates-098686.html) 推荐了一个较旧的 PHP Pear 库 https://pear.php.net/package/Date,它可以做到这一点。

    或者扩展 Doctrine datetime 类型?

    您的实体中的 Doctrine 映射是 DateTime 吗?您是否键入提示日期时间?如果这些都检查出来是否有相关的错误?

    还有其他要检查的。你是在克隆日期,而不是仅仅修改原始日期吗?例如,如果您有:

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

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

    【讨论】:

    • 感谢您的回答,我根本没有处理数据。如果我查询实体,日期字段如上所示。据我所知,PHP 版本 5.1 中删除了范围限制“但是,在 PHP 5.1.0 之前,在某些系统(例如 Windows)上,此范围限制为 01-01-1970 到 19-01-2038。”#跨度>
    • 好吧,如果您的服务器不是 32 位系统,并且您根本没有事先处理日期,那么我会说 Timclutton 的回答:YYYY 更改为的某种格式问题年。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2017-05-23
    相关资源
    最近更新 更多