のりさんから、「rNoteでDateタグなしでアップしてるのにRSSの日付が、YYYY-MM-DDT00:00:00+0900 みたいになって、うまくタイムスタンプが取れてないみたいんだけど、なんでや?」って話をされて、ちょいと調査してみました。
まず、skinの内容を見てみましょう。 rss_item.skinファイルを覗いてみます。
<dc:date><%=$Date fmt="%Y-%m-%dT%H:%M:%S%z"%></dc:date>
Dateタグってのが使われていて、fmtでフォーマット指定がされていると解釈ができます。 では、Dateタグの定義を見てみましょう。
define(TAG_DATE,'Date'); // 日付のタグ名
これでTAG_DATEを調べればよいというのがわかります。 GetContentsEach関数内で、以下の処理が行われています。
while($tagstr=SkinTagChk(TAG_DATE,$a,$opt)){
$a=str_replace($tagstr,MakeDateStr($g_filelist[$fname][FILELIST_DATE],$opt),$a);
}
MakeDateStrは単純に日付をフォーマットして返すだけです。 という事は、$g_filelist[$fname][FILELIST_DATE]があやしいです。 これはReadFileCache関数で作成される変数で、単純にキャッシュから日付をとってきているだけです。 と、ここまで来たらキャッシュを生成する部分があやしいとなります。
キャッシュの生成時にはファイルのリストを作ります。 ファイルリストはファイル名のハッシュテーブルとなっていて、値には問題となる日付が入ります。 値でソートをかければ、日付順にキャッシュが生成できるというわけです。 そして、そのファイルリストの日付がキャッシュに入るという処理をしています。 つまり、ファイルリスト生成時が問題となるわけです。 では該当のコードを見ていきましょう。
$date=get_XMLTag(TAG_DATE,$datafile);
if(!$date){
$filelist[$dir.$file] = filectime($fullpath);
}else{
$filelist[$dir.$file] = w3cdtf_to_time($date);
}
さて、このコードを見て正直困りました。 Dateタグが存在しない場合は、ファイルの生成日付を取っているのです。 これではのりさんの「Dateタグを入れずにアップしているのに」という前提条件から、0埋めになるのは考えられないのです。 それを証明するために簡単にテストしてみましょう。
<?php
$date = filectime('/Users/btm/develop/php/filectimesample.php');
$format = "%Y-%m-%dT%H:%M:%S%z";
$ret = strftime($format, $date);
print $ret . "\n";
?>
こんなサンプルを用意して実行してみます。
$ php filectimesample.php
2005-09-24T19:22:03+0900
正しく時間もとれています。 というわけで、コードから考えられるのはrNoteは悪くないという事ぐらいです。 なにかしら運用の方でおかしくなっているのではないでしょうか? 例えばFTPが変で、日付情報だけアップしてるとか。 まぁ、そんな謎な動作はしないと思うんだけど...どうなんでしょ? というわけで人柱になるため、このエントリはDateなしで(w どきどき、わくわく。
ちゃんと 2005-09-25T02:00:49+09:00 って出てきました。 というわけで、問題なさそうだなーと思ったら、 のりさんもなんか直してるっぽいですね。 うは、俺時間の無駄じゃんwwww まぁ、空港での暇つぶしに調べただけだからいいんですけどね。