XPressMEのタイムゾーンの設定 
不具合の状況 
XPressMEのRSSと新着情報モジュールのRSSでXPressMEの記事のタイムスタンプが、なぜか一致しないのです。
さらに、XPressMEでは最新の記事もRSSに含まれるのですが、新着情報モジュールのRSSでは含まれていない。
現在の設定は以下のとおり。
XOOPSの全般設定、サーバのタイムゾーン:GMT 同上 デフォルトのタイムゾーン:GMT+0900 ユーザ(自分)のタイムゾーン:GMT+0900 XPressMEのタイムゾーン:UTC+9
この状態で、XPressMEのRSSでの記事のタイムスタンプは正常だが、新着情報モジュールのRSSでは16時間も進んでしまっている。
対応策の検討 
WordPressの記事のタイムスタンプは以下のデータベース項目らしい。
- WordPress1.5のpostsテーブルの中身 - うるめねっと技研 - Linux派 -
post_date: 投稿日時。形式は”YYYY-MM-DD hh:mm:ss” post_date_gmt: GMT形式の日時。日本だと${post_date}-9時間で算出できる
include/date.ini.php が新着情報モジュール用のプラグインなので、中身を見てみる。関係がありそうな箇所は次のところかな。
- function _xpress_new($mydirname, $limit=0, $offset=0)
$sql1 = "SELECT ID, post_author, post_title, post_content, post_type, comment_count, UNIX_TIMESTAMP(post_date) AS unix_post_date, UNIX_TIMESTAMP(post_modified) AS unix_post_modified, post_status FROM ".$table_posts." WHERE (post_status='publish') AND (UNIX_TIMESTAMP(post_date) <= UNIX_TIMESTAMP()) ORDER BY post_date DESC";
- function _xpress_data($mydirname,$limit=0, $offset=0)
$sql = "SELECT ID, post_title, UNIX_TIMESTAMP(post_date) AS unix_post_date, post_status FROM ".$xoopsDB->prefix($wp_prefix . "_posts")." WHERE post_status='publish' ORDER BY ID"; $result = $xoopsDB->query($sql,$limit,$offset);
上記のpost_dateをpost_date_gmtとしてみると、当然ながら、9時間変化したが、まだ7時間進んでいる。なぜ???
これは、.htaccessで設定している、phpのタイムゾーンがずれてるのかも?
sshでサーバにアクセスして、timeコマンドで現在時刻を表示させてみると、MSTで表示された。つまり、サーバ自体はGMT-7。これで計算が合うのかな。
ということで、.htaccessでタイムゾーンを以下のように設定。
php_value date.timezone MST
でも、XOOPSの全般設定、サーバのタイムゾーンを
GMT-7
にすると、だめ。
GMT
とした。
この状態だと、XPressMEのRSSも新着情報モジュールのRSSもXPressMEの記事のタイムスタンプは正常になった。ただし、新着情報モジュールのキャッシュの生成時刻がおかしくなり、xpWikiもおかしい。
結局 
data.ini.phpは元に戻し、XOOPSの全体設定、サーバのタイムゾーンはGMT+9、として様子を見てみる。
うーむ。
やっぱり、基本に戻ろう。
- data.ini.phpは元どおり
- XOOPSの全体設定、サーバのタイムゾーンはGMT-7
- 同上 デフォルトのタイムゾーンはGMT+9
- .htaccessのタイムゾーンはGMT-7
これだと、新着情報モジュールのXPressMEの記事のタイムスタンプがやはりおかしい。
以下は参考(今回はあまり関係がなさそう) 
- WordPressでRSSの時間ずれを修正|ザピースカ
いろいろ調べた結果、wp-rss2.php(RSS2.0の出力プログラム。デフォルトだとこれが選択されるらしい。rss1とかatomを使っていれば該当のところを直す必要あり)の日付を取っている下記のコードを修正すれば良いことが分かった。
mysql2date('D, d M Y H:i:s O', get_lastpostmodified('GMT'), false)
この日付書式のオプションはphpのdate関数と同じで、最後の「O」(ゼロではなくオー)はグリニッジ標準時との時差である。つまり、日本でサーバーを運用していれば問題ないのだが、海外だとその時差分上積みされてしまうらしいのだ。ここを「D, d M Y H:i:s +0900」と明示的に書いてやることで解決しました(参考記事)。コード内に2箇所あるので両方直すこと。
| Page Info | |
|---|---|
| Page Name : | サイト更新記録/2009-01-01 |
| Page aliases : | None |
| Page owner : | gokuraku |
| Can Read | |
| Groups : | All visitors |
| Users : | All visitors |
| Can Edit | |
| Groups : | No one |
| Users : | No one |

