2017-03-22 7 views
2

私はoracleデータベースから日付時刻を取得するエンティティを持っています。 2099年12月31日になる場合もあります(実際には、実際には影響がありません)。 これはSymfonyで1999年12月31日に返されます。PHP + Doctrine ORM - 日時付きエンティティ> 2069

どうすれば修正できますか? PHP Datetimeを拡張する方法はありますか?あるいは、Doctrineのdatetime型を拡張しますか?

おそらく、twigフィルターで日付をチェックして、その< 2000の場合1000年を追加するスムーズな方法がありますか?

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の

事前に感謝し、任意の言語のミスのため申し訳ありませんが、私はネイティブスピーカーではありません:-)

EDITは: 私のサーバーであるLinuxのホスト名3.10.0-229.14.1.el7.x86_64#1 SMP火:これは

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

日のためにEDIT 2私のEnitiyフィールド

ある 9月15日午前15時05分51秒UTC 2015 x86_64の

そして、私のPHPはすべてlib64にファイルを使用している、それは

+0

Oracleから返される日付の形式を確認してください。通常、 'DD-MON-RR'(例えば' 31-DEC-99')のようなものになります。PHPはそれを2099年ではなく1999年と解釈します。 – timclutton

+0

答えてくれてありがとうございます。クエリはdoctrineによって行われ、生の出力は表示されません:-( – WhiteRabbit

答えて

1

私はついに解決策を得ました! timcluttonは正しかった...私は文字列として日付を照会し、データベースを31-12-99形式で取得しました。

ソリューションはOracleSessionInitセットセッションの正しいNLS日付書式イベントリスナー

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

を追加しました。私は最終的に正しいフォーマットで自分の日付を得ました!

ご協力いただきありがとうございます。

0

:-) 64ビットでなければなりません私の最初の考えは、2099年12月31日が32ビット符号付き整数の範囲外であるということです。マニュアルから:http://php.net/manual/en/function.strtotime.php

タイムスタンプの有効範囲は、金、13、典型的には1901年12月午前20時45分54秒UTC火、2038年1月19日午前3時14分07秒UTCへ。 symfonyの/教義にしなければならない、...さらに、全てのプラットフォームが負のタイムスタンプ サポート

(これらは、32ビットの最小値と最大値に対応する日付 は符号付き整数である)しかしこれをチェックし、100年を引いてそれを適合させます。そして、彼らが自分のコードでそれを深くするかどうかはわかりません - 可能です。また、サーバーは64ではなく32ビットでなければなりません。

PHP Datetimeを拡張する方法はありますか?

Oracleのドキュメント(http://www.oracle.com/technetwork/articles/fuecks-dates-098686.html)まさにそれを行い、古いPHP梨ライブラリhttps://pear.php.net/package/Dateをお勧めします。

Doctrine datetime型を拡張するか、拡張しますか?

あなたのエンティティのDoctrineマッピングはDateTimeですか? DateTimeのヒントをタイプしていますか?これらのすべてがチェックアウトされている場合、関連するエラーはありますか?

他に何かを確認してください。オリジナルを取り除くのではなく、日付を複製していますか?たとえば、あなたが持っている場合:

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

これも予期しない結果をもたらす可能性があります。

+0

回答ありがとうございます。私はデータを操作していません。エンティティに日付フィールドが表示されている場合 範囲の制限がで削除されました私が知っている限りPHPのバージョン5.1 "しかし、PHP 5.1.0より前のこの範囲は、一部のシステム(Windowsなど)では01-01-1970から19-01-2038に制限されていました。"# – WhiteRabbit

+0

あなたのサーバが ' 32ビットシステムでは、あらかじめ日付を操作していないのであれば、Timcluttonの答えです:YYYYがYYに変更される何らかのフォーマット問題。 – ASOlivieri

関連する問題