2016-12-15 13 views
0

Magento 2コレクションでdatetimeを取得する際に問題があります。Magento 2タイムゾーン

例えば、これは、データベースのデータです:

entity_id | paid_at 
------------------------------------------ 
     1 | 2016-12-13 07:30:39 

フルデータベースクエリ:

CREATE TABLE `pmnt` (
    `entity_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', 
    `paid_at` timestamp NULL DEFAULT NULL COMMENT 'Payment date', 
    PRIMARY KEY (`entity_id`), 
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COMMENT='pmnt' 

とMagentoのコレクションを返します:

[ 
    'entity_id' => 1 
    'paid_at' => '2016-12-13 06:30:39' 
] 

これはZend_Db_Selectのレベルに返され、間違った日付グリッド、フォーム、コレクション、負荷にあります。

何が奇妙なのですか、テーブルcms_blockは大丈夫です。同じupdated_atとcreated_atがdbとmagentoコレクションの両方にあることを意味します。

bootstrap.phpにタイムゾーンを設定しようとしましたが、cms_blockコレクションのdatetimeが間違っています。

$table = $installer->getConnection() 
    ->newTable($tableName) 
    ->addColumn(
     'entity_id', 
     Table::TYPE_INTEGER, 
     null, 
     [ 
      'identity' => true, 
      'unsigned' => true, 
      'nullable' => false, 
      'primary' => true, 
     ], 
     'ID' 
     ) 
    ->addColumn(
     'paid_at', 
     Table::TYPE_TIMESTAMP, 
     null, 
     [ 
      'nullable' => true 
     ], 
     'Payment date' 
    ); 

+0

あなたの 'paid_at'カラムのMySQLデータタイプは何ですか?あなたの質問の一番上の例に示されている*データベースデータ*を検索するためにあなたはどのツールを使用しましたか? –

+0

こんにちは、paid_atはタイムスタンプです、私は私の投稿全テーブルのクエリを編集しました。このデータをテーブルから取得するには、phpmyadmin、phpstorm dbツール、commandline mysqlツールを使用しようとしました。 – amr

答えて

1

MySQLでは、TIMESTAMPのデータ型は常にUTCで格納されます。アプリケーションが(コマンドラインのmysqlツールやmagentoのように)MySQLにタイムスタンプに格納される時刻値を格納するとき、その時刻値はで、常にが現在の設定time_zoneからUTCに変換されます。アプリケーションがTIMESTAMPの値を取得すると、その値は常にUTCから現在のtime_zoneに変換されます。したがって、と言うとき、これはデータベースデータです。現在のタイムゾーン設定を知らなくても、実際に何が格納されているのかを知るのは難しいです。

+0

このフィールドをdatetime、same-wrong-effectに変更するだけです。また、同じデータベース内のテーブルcms_blockには、タイムスタンプ付きのフィールドがあり、コレクションによって取得された値は正しいです。 timestampがEurope/Warsawの場合、mysqlデータベースはグローバルとセッションの両方でSYSTEMに設定されます – amr

+0

あなたが正しいと思われます。私はこの列タイプを変更しました。キャッシュはきれいではなかったので、私は正しい結果を得ていませんでした。とにかく、なぜmagentoが間違ったtime_zoneを設定するのかまだ分かりません。/ – amr

0

Uiコンポーネントグリッド管理で。

ファイルアプリ/コード/ベンダー/あなたのモジュール/ビュー/ adminhtml/ui_component/listing.xml

<column name="paid_at" class="Magento\Ui\Component\Listing\Columns\Date"> 
    <argument name="data" xsi:type="array"> 
     <item name="config" xsi:type="array"> 
      <item name="filter" xsi:type="string">dateRange</item> 
      <item name="component" xsi:type="string">Magento_Ui/js/grid/columns/date</item> 
      <item name="dataType" xsi:type="string">date</item> 
      <item name="label" xsi:type="string" translate="true">Paid At</item> 
      <item name="sortOrder" xsi:type="number">8</item> 
     </item> 
    </argument> 
</column> 
+0

これはまさに私がやっていることです。私が言ったように、問題はUIコンポーネントではありません。私は収集負荷レベルで間違ったデータを取得しています。 – amr

0

サーバーのタイムゾーンがある:あなたは、このコードでお店のタイムゾーンを経由して、カラムpaid_atを表示することができますバックエンドのマゼンタタイムゾーン設定と同じではありません。

ダイレクトSQLクエリでは、サーバータイムゾーンの結果が得られます。 とマゼンタのコレクションでは、同じデータが設定時間帯に従って変換されます。