web-dev-qa-db-ja.com

日付の奇妙な行動

カレンダフィールドの入力をJTable :: storeに保存したいと思います。

そうするために私はこれをやっています:

フォーム宣言:

    <field name="creationdate"
           type="calendar"
           default="NOW"
           label="COM_BESTIA_FIELDS_CREDITCREATIONDATE_LABEL"
           description="COM_BESTIA_FIELDS_CREDITCREATIONDATE_DESC"
           format="%d.%m.%Y %H:%M"
           filter="user_utc"/>

JTableのStore-Method:

    if ( !empty( $input[ 'creationdate' ] ) && !( $input[ 'creationdate' ] == "0000-00-00 00:00:00" ) )    // Prepare date to be saved in database
    {
        // Set this to a format the sql-table is able to save
        $date               = JFactory::getDate($input[ 'creationdate' ]);
        $this->creationdate = $date->toSql();
    }
    else
    {
        throw new Exception(JText::_('COM_BESTIA_ERROR_INCORRECTDATES'));
    }

これは正常に動作します。出力をvar_dumpした場合

    var_dump(JFactory::getDate($input[ 'creationdate' ])->toSql());
    var_dump(JFactory::getDate($this->creationdate)->toSql());

私はこの結果を得ています:

string(19) "2016-05-13 09:30:00" string(19) "2016-05-13 09:30:00"

正解です。

しかし、別の形で私はこの結果を得ています:

XML:

var_dump:

    var_dump(JFactory::getDate($input[ 'creationdate' ])->toSql());
    var_dump(JFactory::getDate($this->creationdate)->toSql());

結果:

string(16) "13.05.2016 09:41" string(19) "2016-05-13 07:41:00"

なぜ異なる値を取得しているのですか?

編集:$this->creationdateの代わりに入力を使用する理由は、CLIスクリプトを使用して要素を作成しているためです。そして、今までは、入力ではなく$this->creationdateを使用すると、データベースに値を取得できませんでした。

2
MyFault

このためのコードを見ました。 JDate :: dateformatはパブリックです。つまり、どのコードでも値を変更できます。ソースツリー(およびすべてのプラグイン/モジュール/ライブラリ)でgrep/searchを実行して、割り当てを探します。

時差の問題を見ると、JFactory()が2つの異なる方法で日付を構築していると思います。 1つ目は、$ input ['creationdate']の値で、文字列を渡します。 2番目は数値を渡すことです。 JDate()のコンストラクタを見ると、日付引数が数値の場合、タイムスタンプがUTCに変換されます。

また、date-> getTimezone()の値をダンプして調べる必要もあります。

2
George Sexton