2016-03-02 38 views
1

我使用的是持久性原則,我的所有日​​期都關閉了。當它們應該是-6(美國/芝加哥)時,它們被存儲爲+6。我有PHP和對美國/芝加哥的應用服務器,可以通過確認以下內容:更正oracle上的學說datetime

php > echo (new \DateTime())->format('Y-m-d h:m:i a e'); 
2016-03-02 02:03:47 pm America/Chicago 

我創建了一個表在Oracle與調試:

CREATE TABLE "APP"."DATE_TEST" 
    ( "ID" VARCHAR2(36 BYTE), 
    "LOCALTZ" TIMESTAMP (0) WITH LOCAL TIME ZONE, 
    "NOTLOCALTZ" TIMESTAMP (0) WITH TIME ZONE 
    ) 

我有一個測試實體用下面的教義映射:

Acme\Project\Domain\Asset\Entity\DateTest: 
    type: entity 
    table: DATE_TEST 
id: 
    id: 
     type: guid 
     generator: 
      strategy: none 
fields: 
    localtz: 
     type: datetime 
     column: localtz 
    notlocaltz: 
     type: datetimetz 
     column: notlocaltz 

我執行一些代碼將數據推入表:

protected function execute(InputInterface $input, OutputInterface $output) 
    { 
     $test = new DateTest(); 
     $datetime = new \DateTime(); 
     $test->setLocalTz($datetime); 
     $test->setNotLocalTz($datetime); 
     $output->writeln($test->getId()); 
     $output->writeln($datetime->format('Y-m-d h:i:s a')); 
     $output->writeln($datetime->getTimezone()->getName()); 
     $em = $this 
      ->getContainer() 
      ->get('doctrine.orm.entity_manager'); 
     $em->persist($test); 
     $em->flush(); 
     $output->writeln("Test complete."); 
    } 

下被輸出

de4e5dcd-9fd6-4b5d-b9f0-6db9d1ef0582 
2016-03-02 02:51:02 pm 
America/Chicago 
Test complete. 

而且這是我在數據庫

de4e5dcd-9fd6-4b5d-b9f0-6db9d1ef0582 02-MAR-16 08.51.02.000000000 AM 02-MAR-16 02.51.02.000000000 PM +06:00 

看到我已經得到了oracle session init迷上了。

當我查詢當前時間的數據庫,它看起來是正確的:

SELECT SYSTIMESTAMP "NOW" FROM DUAL; 
02-MAR-16 02.56.44.342456000 PM -06:00 

任何人能發現我在做什麼錯?

+0

值得檢查?通過php執行這個查詢,如果你使用一個單獨的客戶端來執行misc db活動,執行它:'SELECT DBTIMEZONE,SESSIONTIMEZONE from dual;' – Beege

+0

@Beege從php執行這些查詢返回「+00:00」兩個查詢。這似乎不正確... – David

回答

2

我跟蹤到了OracleSessionInit類,它設置了錯誤的時區格式。在會話格式中,OraclePlatform類在時間和偏移量之間沒有空格。

覆蓋容器中的格式解決了我的問題。

services: 
    oci8.listener: 
     class: Doctrine\DBAL\Event\Listeners\OracleSessionInit 
     arguments: 
      - { NLS_TIMESTAMP_TZ_FORMAT: "YYYY-MM-DD HH24:MI:SSTZH:TZM" } 
     tags: 
      - { name: doctrine.event_listener, event: postConnect } 

我打開issue on github因爲我敢肯定這是一個錯誤。

+0

很好的追溯。我無法讓我的PHP返回類似(壞)的結果。 – Beege