[Tep-j-general] Re: タイムゾーンの変更

Back to archive index

TAMURA Toshihiko tamur****@bitsc*****
2004年 12月 10日 (金) 11:31:41 JST


こんにちは、田村です。

Margyさん:

> そこで一つアドバイスいただきたいのですが、私の入れているCredit
> Class &  Gift Voucherのモジュール内で、どうにもこの変更が効かない
> 部分がありました。
> 問題のコードは、catalog/includes/modules/order_total/ot_coupon.php
> というファイルなのですが、該当部分はデフォルトでこんなコードです。
> 
>     $date_query=tep_db_query("select coupon_start_date from " .
> TABLE_COUPONS . "
>     where coupon_start_date <= now() and
>     coupon_code='".$HTTP_POST_VARS['gv_redeem_code']."'");
> 
> ここの now() を $jp_date_time に置き換えるために、いろいろと試行
> 錯誤の末、now() を now($jp_date_time) とすることで、どうにか正常に
> 機能するようになりました。

$jp_date_time に置き換えてSQLの実行がエラーになったのではなくて、
意図した結果が得られなかったということでしょうか?
それでしたら、DBの中にタイムゾーン変更前と変更後の日時が
混じっているためということはないですか?

MySQLのDATETIME型がタイムゾーンをどうあつかっているのか、
調べてもよく分かりませんでしたが、
サーバのタイムゾーンを参照してGMTに変換して記録しているのではないかと
思います。

基本的には、DBに記録する日付時刻のタイムゾーンをアプリケーション
レベルで変更するのは避けたほうがいいと思います
(MySQLのバージョン変更やサーバの変更時に問題になるので)。
つまり、表示する際だけ日付時刻の変換をすればいいという意味です。

osCommerceにそれが用意されていないのが問題なんですが、
Margyの書かれたようなカスタマイズでも、
レコード間の日付時刻の整合性がとれていればうまく動くように思います。


> ただ、他のファイルでは now() を $jp_date_time(クエリ中の場合は
> '".$jp_date_time."')と置き換えることで実現できた変更が、この
> ファイルだけ、こういう記述のしかたでしか動かないのが、今ひとつ
> 気になってます。
> now($jp_date_time) という記述のしかたは正しいのでしょうか?

now()のこういう使い方はオンラインマニュアルには掲載されてないですね。
http://dev.mysql.com/doc/mysql/ja/Date_and_time_functions.html

実行時のSQLをログに落として確認すれば何か分かるかもしれません。


# 最近のMySQL4.1では時間関数でタイムゾーンをサポートするという
# ニュースが流れていました。
# http://dev.mysql.com/tech-resources/articles/4.1/time.html
# > 時間関数(DATE, TIME, DATETIME, TIMESTAMP )
# > はMySQL 4.1では大きく変更されました。これはマイクロ秒
# > とタイムゾーンのサポートを含みます。

-- 
田村敏彦 / 株式会社ビットスコープ
E-mail:tamur****@bitsc*****
http://www.bitscope.co.jp/





Tep-j-general メーリングリストの案内
Back to archive index