[PHP-users 35088] Re: ISO 8601 日付が上手く parse されない

shige02 @ mac.com shige02 @ mac.com
2010年 4月 5日 (月) 01:05:39 JST


重松です。

その後なんですけど、試しに strtotime() に食わせて見たところ、それなりの結果が得られました。
それなりの理由ですが、これの戻り値は var_dump() したところ、int でしたので、1 秒以下のデータがあっても欠落してしまうからです。

他にも、ISO 8601 日付として、Wikipedia に記載されているさまざまな値を入力したところ、処理できないものがいくつか見受けられます。

 2004-092 -> NG (false が返る)
 2004-W14-4 -> OK
 11:30:30,5 -> NG (false)
 11:30:30.5 -> NG (11:30:30 最後の .5 が欠落)
 11:30.5 -> NG (11:30:05 小数点表記を理解せず)
 11:30,5 -> NG (false)

というような結果でした。

今のところ、入力されるであろうデータは、date('c') で得られる結果と同じ書式のものに限定されると思うので、strtotime() で問題なく処理可能と思います。

PHP 5.2 以降ならば、DateTime を使ったほうが、スッキリするので、いいかもしれませんが、DATE_ISO8601 で出力すると、タイムゾーン識別子が、+0000 という風に : 抜きで出力されますね。DATE_ATOM とか、DATE_W3C だと、+00:00 になります。

<?php
date_default_timezone_set('Asia/Tokyo');

$datetime = new DateTime('2010-04-05T01:23:45Z');

echo $datetime->format(DATE_ISO8601);
?>

On Apr 1, 2010, at 8:20 PM, shige02 @ mac.com wrote:

> 重松です。
> 
> 表題の通りなんですが、今 XML からデータを読み込む必要があり、ISO 8601 日付という形式らしいんですが、
> 
> <ContactXMLItem lastModifiedDate="2009-04-10T01:57:00+09:00">
> 
> というような感じで整形されています。
> 
> ちょっと古いのですが、http://www.kanzaki.com/docs/html/dtf.html を読むと、XML の場合、「W3C-DTFの年月日時分秒をフルに表すフォーマット(5)(6)がdateTime型として定義されています。」というくだりがあり、要するに、秒の部分に、小数点以下が来ることもあるように読めるのですが、自分が読み込もうとしているデータにはそのような形式は見受けられませんでした。
> 
> こういうのって、RSS リーダーなんか XML なんだから、よく使うと思うんで、自分で書かないでもあるだろうと思って調べて見たのですが、php 5 から date() に c というフォーマットが追加になったようで、これを使えば楽できると思ったんですが、動きません。
> 
> 何か勘違いしているんでしょうか?
> 
> <?php
> 
> date_default_timezone_set('Asia/Tokyo');
> 
> $str = date('c');
> echo "$str\n\n";
> var_dump(date_parse_from_format('c',$str));
> 
> ?>
> 
> 2010-04-01T20:15:51+09:00
> 
> array(12) {
>  ["year"]=>
>  bool(false)
>  ["month"]=>
>  bool(false)
>  ["day"]=>
>  bool(false)
>  ["hour"]=>
>  bool(false)
>  ["minute"]=>
>  bool(false)
>  ["second"]=>
>  bool(false)
>  ["fraction"]=>
>  bool(false)
>  ["warning_count"]=>
>  int(0)
>  ["warnings"]=>
>  array(0) {
>  }
>  ["error_count"]=>
>  int(2)
>  ["errors"]=>
>  array(2) {
>    [0]=>
>    string(35) "The format separator does not match"
>    [1]=>
>    string(13) "Trailing data"
>  }
>  ["is_localtime"]=>
>  bool(false)
> }
> 
> $ php -v
> PHP 5.3.1 (cli) (built: Feb 11 2010 02:32:22) 
> Copyright (c) 1997-2009 The PHP Group
> Zend Engine v2.3.0, Copyright (c) 1998-2009 Zend Technologies
> 
> -- 
> Osamu Shigematsu
> 
> _______________________________________________
> PHP-users mailing list  PHP-users @ php.gr.jp
> http://ml.php.gr.jp/mailman/listinfo/php-users
> PHP初心者のためのページ - 質問する前にはこちらをお読みください
> http://oldwww.php.gr.jp/php/novice.php3

-- 
Osamu Shigematsu



PHP-users メーリングリストの案内