исправляя учение datetime на оракуле

1

Я использую доктрину для настойчивости, и все мои даты отключены. Они хранятся как +6, когда они должны быть -6 (Америка/Чикаго). У меня есть php и сервер приложений в Америке/Чикаго, и я могу подтвердить это следующим:

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.

Когда я запрашиваю базу данных для текущего времени, она выглядит правильно:

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

Может ли кто-нибудь определить, что я делаю неправильно?

  • 0
    Стоит проверить? Выполните этот запрос через php, и если вы используете отдельный клиент для операций misc db, выполните его там: SELECT DBTIMEZONE, SESSIONTIMEZONE from dual;
  • 0
    @Beege, выполняющий те из php, возвращает "+00: 00" для обоих запросов. Это не кажется правильным ...
Теги:
doctrine
doctrine2

1 ответ

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 } 

Я открыл вопрос о github, потому что я уверен, что это ошибка.

  • 0
    Хорошая трассировка назад. Я не мог заставить свой php вернуть похожие (плохие) результаты.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню