[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 メーリングリストの案内