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

Back to archive index

Margy Mutoh margy****@roseb*****
2004年 12月 10日 (金) 13:05:37 JST


田村さん、こんにちは。Margyです。

> $jp_date_time に置き換えてSQLの実行がエラーになったのではなくて、
> 意図した結果が得られなかったということでしょうか?

やりたかったことは「クーポン期間の開始日の0時(日本時間)から
クーポンが有効になる」ということなんです。
うちのサーバはアメリカで、日本時間より15時間ほどずれている
ため、「○月○日から使えます」というクーポンを前もって配り、
お客さんが開始日になって買い物しに来ても、午後3時(15時)ごろ
までは「クーポン期間が始まっていません」と蹴られてしまうん
ですね。それをどうにかしたいと思っていました。

そこで「今日から始まるクーポン」を作って15時以前の時間に
チェックアウト操作をする、というテストを行いました。

* 単純に now() を $jp_date_time に置き換えた場合、

1064 - You have an error in your SQL syntax. Check the manual that
corresponds to your MySQL server version for the right syntax to use
near 'and coupon_code='test6'' at li

select coupon_start_date from coupons where coupon_start_date <= and
coupon_code='test6'

[TEP STOP]

というエラーが出ました。下の行を見ると、「<=」と「and」の間、
日付時刻が入っているべきと思われる部分に何も入っていないので、
この記述のしかたでは日付時刻がまったく取得できてないんだな、
と思いました。

* now() を '".$jp_date_time."' に置き換えた場合、エラーは出ま
せんが、「クーポン期間が始まっていません」というosCommerce上
のエラーメッセージが出るので、タイムゾーンの変更ができていない
(=アメリカ時間のまま取得されている)んだろうと思いました。

他のphpファイル内では、クエリの途中に now() が出てきた場合、
'".$jp_date_time."' に置き換えることですべてうまく行ったので、
なぜかなあ、と。
'$jp_date_time' や "$jp_date_time" や .$jp_date_time. …と、
(明らかに「そうじゃないだろう?」という書き方もありますが)
いろいろ書いて試してみましたが、いずれも上記どちらかの結果
でした。
.や"の位置(対応)もだいぶよく見てみたつもりでしたが、わかり
ませんでした。

> それでしたら、DBの中にタイムゾーン変更前と変更後の日時が
> 混じっているためということはないですか?

クーポンの開始日時はDBの中にあるわけですが、その日時と
チェックアウト時の日時($jp_date_time)を比較する部分なので、
どうなんでしょう…DB内の不整合(混在)は関連してくるので
しょうか?(私自身よくわかっていません…)

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

そうですね。できれば私もサーバ側で個別の設定をできる(してくれる)
といいなと思うんですが、それができず、しかも前述のような「せっかく
前もってクーポンを配って、それを楽しみにお客さんが開始日当日に
来てくれたのに使えない」という格好悪いことになるので、なんとか
できないかと苦肉の策でした。

> osCommerceにそれが用意されていないのが問題なんですが、

実は最近、こちらでも以前に話題が出たXOOPSをいじってまして、
XOOPSでは初期設定でタイムゾーンの設定ができるので、真似できない
かとプログラムをのぞいてみたものの、とても私の手の届くとこには
ない様子で…(^_^; で、今回の改造になった次第です。

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

Credit Class & Gift Voucherというcontribution全体の中でも整合
するようにしなきゃならない、ということですよね?
本体の変更もけっこうな数でしたし、contribution全体も、となると、
やはりあまり人におすすめできる改造じゃないですね…(汗)

>>now($jp_date_time) という記述のしかたは正しいのでしょうか?
> 
> now()のこういう使い方はオンラインマニュアルには掲載されてないですね。
> http://dev.mysql.com/doc/mysql/ja/Date_and_time_functions.html
> 
> 実行時のSQLをログに落として確認すれば何か分かるかもしれません。

そうなんです、マニュアルにないやり方なので、非常に不安ながら、
とりあえず動いたので結果オーライでいいのか!?と、まだ不安です。
ログとりは、またやってみます。

> # > 時間関数(DATE, TIME, DATETIME, TIMESTAMP )
> # > はMySQL 4.1では大きく変更されました。これはマイクロ秒
> # > とタイムゾーンのサポートを含みます。

難しいことはわかりませんが…4.1になったら、いまphpMyAdminで
言語の選択をするように、タイムゾーンの選択もできるようになる
んでしょうかね?(違いますか…)
いずれにしても、DBで設定することでタイムゾーンを選べるように
なれば、海外サーバでの運用もすごくラクになりますね。
うちも早くアップグレードしてくれるよう祈ります。

Margy Mutoh





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