[rNote]

rNoteの日付の扱い方 / 2005-09-25 (日)

のりさんから、「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 まぁ、空港での暇つぶしに調べただけだからいいんですけどね。

[ ツッコミの受付は終了しています ]
1: のり (09/25 18:11)
検証ご苦労様です。かなり参考になりました。ありがとうございます。
Date 無しだと、元 xml(何)のフォーマット変更などを行うと恐ろしいことになったりするような気がして、元 xml に、初出の日付を示す <publish> というのと、あとで記事の修正をした日時を示す <update> なる語彙を追加導入したんですが、そこ等あたりとスキンの不備が相まって私のところではえらいことになってしまっていたようです。
現在は、極力 Date に頼らず、自前で持っている時間情報を使うように変更しています。が、最終更新日時あたりは、どこから引っ張ってくるかというあたりが解決できないので、$last_modified のお世話にならざるを得ないといった状態ですね。
この記事のリンク元 | 4 | 1 |