MagpieRSSではW3CDTFを上手く扱えない模様

rss_utils.incのparse_w3cdtf関数がおかしげ。

で、Perlメモ/W3C形式の日時の解析 - Walrus, Digit.を参考に、6パターンの日付文字列をパース出来るようにいじくってみた。


rss_utils.inc内のバージョン表記は"0.51"でした。


--- rss_utils.inc.orig  2006-11-02 22:57:41.000000000 +0900
+++ rss_utils.inc       2006-11-02 23:40:36.000000000 +0900
@@ -25,11 +25,15 @@
 function parse_w3cdtf ( $date_str ) {
     
     # regex to match wc3dtf
-    $pat = "/(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})(:(\d{2}))?(?:([-+])(\d{2}):?(\d{2})|(Z))?/";
+    $pat = "/^(\d{4})(?:-(\d{2})(?:-(\d{2})(?:T(\d{2}):(\d{2})(?::(\d{2})(?:\.(\d+))?)?(Z|([+-]\d{2}):(\d{2}))?)?)?)?$/";
     
     if ( preg_match( $pat, $date_str, $match ) ) {
-        list( $year, $month, $day, $hours, $minutes, $seconds) = 
-            array( $match[1], $match[2], $match[3], $match[4], $match[5], $match[6]);
+        $year    = $match[1];
+        $month   = (!empty($match[2])) ? $match[2] : "01";
+        $day     = (!empty($match[3])) ? $match[3] : "01";
+        $hours   = (!empty($match[4])) ? $match[4] : "00";
+        $minutes = (!empty($match[5])) ? $match[5] : "00";
+        $seconds = (!empty($match[6])) ? $match[6] : "00";
         
         # calc epoch for current date assuming GMT
         $epoch = gmmktime( $hours, $minutes, $seconds, $month, $day, $year);
@@ -39,8 +43,9 @@
             # zulu time, aka GMT
         }
         else {
-            list( $tz_mod, $tz_hour, $tz_min ) =
-                array( $match[8], $match[9], $match[10]);
+            $tz_mod  = (!empty($match[8]))  ? substr($match[8], 0, 1) : "+";
+            $tz_hour = (!empty($match[9]))  ? substr($match[9], 1, 2) : "00";
+            $tz_min  = (!empty($match[10])) ? $match[10]              : "00";
             
             # zero out the variables
             if ( ! $tz_hour ) { $tz_hour = 0; }
@@ -54,7 +59,7 @@
                 $offset_secs = $offset_secs * -1;
             }
             
-            $offset = $offset_secs; 
+            $offset = $offset_secs;
         }
         $epoch = $epoch + $offset;
         return $epoch;
<?php
 
require_once "rss_utils.inc";
 
function test_parse_w3cdtf() {
    // 1)YYYY
    $ts = parse_w3cdtf("2006");
    if ($ts === -1) {
        echo "E";
    } else if (gmdate("Y", $ts) === "2006") {
        echo ".";
    } else {
        echo "F";
    }
 
    // 2)YYYY-MM
    $ts = parse_w3cdtf("2006-03");
    if ($ts === -1) {
        echo "E";
    } else 
    if (gmdate("Y/m", $ts) === "2006/03") {
        echo ".";
    } else {
        echo "F";
    }
 
    // 3)YYYY-MM-DD
    $ts = parse_w3cdtf("2006-03-24");
    if ($ts === -1) {
        echo "E";
    } else 
    if (gmdate("Y/m/d", $ts) === "2006/03/24") {
        echo ".";
    } else {
        echo "F";
    }
 
    // 4)YYYY-MM-DDThh:mmTZD
    $ts = parse_w3cdtf("2006-03-24T01:40Z");
    if ($ts === -1) {
        echo "E";
    } else 
    if (gmdate("Y/m/d h:i", $ts) === "2006/03/24 01:40") {
        echo ".";
    } else {
        echo "F";
    }
    $ts = parse_w3cdtf("2006-03-24T10:40+09:00");
    if ($ts === -1) {
        echo "E";
    } else 
    if (gmdate("Y/m/d h:i", $ts) === "2006/03/24 01:40") {
        echo ".";
    } else {
        echo "F";
    }
 
    // 5)YYYY-MM-DDThh:mm:ssTZD
    $ts = parse_w3cdtf("2006-03-24T01:40:33Z");
    if ($ts === -1) {
        echo "E";
    } else 
    if (gmdate("Y/m/d h:i:s", $ts) === "2006/03/24 01:40:33") {
        echo ".";
    } else {
        echo "F";
    }
    $ts = parse_w3cdtf("2006-03-24T10:40:33+09:00");
    if ($ts === -1) {
        echo "E";
    } else 
    if (gmdate("Y/m/d h:i:s", $ts) === "2006/03/24 01:40:33") {
        echo ".";
    } else {
        echo "F";
    }
 
    // 6)YYYY-MM-DDThh:mm:ss.sTZD
    $ts = parse_w3cdtf("2006-03-24T01:40:33.9Z");
    if ($ts === -1) {
        echo "E";
    } else 
    if (gmdate("Y/m/d h:i:s", $ts) === "2006/03/24 01:40:33") {
        echo ".";
    } else {
        echo gmdate("Y/m/d h:i:s", $ts) . "\n";
        echo "F";
    }
    $ts = parse_w3cdtf("2006-03-24T10:40:33.9+09:00");
    if ($ts === -1) {
        echo "E";
    } else 
    if (gmdate("Y/m/d h:i:s", $ts) === "2006/03/24 01:40:33") {
        echo ".";
    } else {
        echo "F";
    }
 
    echo "\n";
}
test_parse_w3cdtf();
 
?>
プロフィール

このブログ記事について

このページは、koshigoeが2006年11月 3日 00:05に書いたブログ記事です。

ひとつ前のブログ記事は「Right FieldsはAPI対応してますか?」です。

次のブログ記事は「PHP用Treemapライブラリ」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。