これは私の現在のクエリです:
_$uvdatetime = JFactory::getDate('now', new DateTimeZone('Europe/Athens'));
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select("distinct ". $db->quoteName('catid'));
$query->from($db->quoteName('jos_k2_items'));
$query->where($db->quoteName('publish_up') .' <= '. $db->quote( $uvdatetime ));
_
_publish_up
_と正しく比較するために、_$uvdatetime
_フィールドのタイムゾーンをUTCからEETに変換する必要があります。
検索後、以下のように_compare_tz
_を試してみました。
_$query->where convert_tz($db->quoteName('publish_up'),'GMT','EET') .' <= '. $db->quote( $uvdatetime );
_
ただし、次のメッセージが表示されます。
予期しないT_STRING
Joomlaクエリで_convert_tz
_を使用する方法はありますか?
そうでない場合、この変換を達成するための別の/より良い方法はありますか?
編集:混乱を避けるために、このコードの目的を明確にする必要があります
私の最初の目標は、記事がTODAYと書かれたときにメニュー項目にクラススタイルを与えることです。
問題は、記事が00:00から03:00(EEST)までの公開日で保存されている場合、joomlaがそれをUTCとして保存することです。
例:「2018-09-04 01:00:00」は「2018-09-03 22:00:00」として保存されます。ある日遡ります...
これは私が変換しようとしているものです。時間と日付。私ははるかに単純なクエリを使用していました:
_$query = "SELECT DISTINCT catid FROM jos_k2_items WHERE DATE(publish_up)>=CURDATE()";
_
しかしそれでも.. convert_tzは機能しません
仕様:Centos 7.5、MariaDB 5.5、plesk 17.8
タイムゾーンをmysqlにロードする必要があります。(私は この優れた投稿 に従いました)
SELECT CONVERT_TZ('2012-06-07 12:00:00', 'GMT', 'America/New_York');
を実行すると、nullが返されました。つまり、タイムゾーンは読み込まれません。
だから私はsshでログインして与えます
_mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u admin -p`cat /etc/psa/.psa.shadow` mysql
_
これは面倒なインストールであることを忘れないでください。面倒ではない場合は、「-u root」とmysqlパスワードを使用してください。 2つの警告が表示される場合があります
_Warning: Unable to load '/usr/share/zoneinfo/leapseconds' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/tzdata.zi' as time zone. Skipping it.
_
this に基づいています。
ゾーンが読み込まれました。前のクエリを実行してテストできます。
そして今、ミックのクエリを使用してタイムゾーンを適切に変換できます。
_ $query->where("DATE(CONVERT_TZ(publish_up, 'GMT', 'Europe/Athens')) = DATE(CONVERT_TZ(NOW(), 'GMT', 'Europe/Athens'))");
_
ヨーロッパ/アテネでEETを変更する必要があった
めっちゃすごい。乾杯!
CONVERT_TZ()
を使用する代わりに、クエリでINTERVAL
を使用して、夏時間を無視した変換を実行し、php変数の使用を回避できます。
_$query->where("DATE(publish_up + INTERVAL 3 HOUR) = DATE(NOW() + INTERVAL 3 HOUR)");
_
これにより、現在の時刻と_publish_up
_の時刻が繰り上げられるため、現在の日付に該当する行を特定できます。
ここにsqlfiddleがあります: http://sqlfiddle.com/#!9/859cd7/4
ただし、夏時間に敏感なソリューションの精度が必要な場合は、比較の両側でCONVERT_TZ()
を使用できますが、省略形を処理するためにデータベースのタイムゾーンテーブルを更新する必要がある場合があります( Stackoverflowまたはそれ以上のウェブを検索して、これに関する指示を見つけることができます)。
_$query->where("DATE(CONVERT_TZ(publish_up, 'GMT', 'EET')) = DATE(CONVERT_TZ(NOW(), 'GMT', 'EET'))");
_
*元のスニペットでは、[convert_tz()] [1]関数を文字列としてクエリビルダーに渡す必要があります。いくつかの括弧と引用符がありませんでした。
* _publish_up
_は技術的にバッククォートを必要としないため、省略した場合のクエリは読みやすくなります。
あなたが試したことに明らかなphp構文エラーがあります。 convert_tz
はMySQL関数であり、MySQLで処理されるトリングとしてクエリ内で渡すために必要です。
以下のようなものを試してください:
$query->where('convert_tz('. $db->quoteName('publish_up').', "+00:00","+03:00") <= '. $db->quote( $uvdatetime ));
最後に、 MySQL docs で名前付きタイムゾーンをconvert_tz
関数