1

私はこのコードを持っています:

<?php
    $start = new Zend_Date("2011-09-06T10:00:00+02:00",Zend_Date::ISO_8601);
    $end   = new Zend_Date("2011-09-06T10:01:00+02:00",Zend_Date::ISO_8601);
    echo $end->sub($start);
?>

要するに、私は2つの日付を作成し、それらの間に1分の違いがあります。次に、それらの差(減算)を印刷します。

ただし、結果は次のとおりです。

01-01-1970 02:01:00

基本的に、この動作から私が理解しているのは、Zend_Dateはタイムゾーンを考慮せずに日付を操作し、タイムゾーンを結果に戻すということです。もちろん、これは、減算結果がタイムゾーンの値(私の場合は+ 2h)だけずれていることを意味します。

これを回避するための最良の方法は何ですか?

4

1 に答える 1

1

はい、エコーするときはZend_Date、タイムゾーンが考慮されます。GMT日付用にフォーマットされた差を取得するには、タイムゾーンを明示的に設定する必要があります。

$start = new Zend_Date("2011-09-06T10:00:00+02:00",Zend_Date::ISO_8601);
$end   = new Zend_Date("2011-09-06T10:01:00+02:00",Zend_Date::ISO_8601);
echo $end->sub($start)->setTimezone('GMT')->get(Zend_Date::ISO_8601);

これは次のように出力します:1970-01-01T00:01:00 + 00:00

ちなみに、Zend_Dateの動的ローカリゼーション機能が必要ない場合は、それを避けたり、PHPのネイティブDateTimeAPIを使用したりすることをお勧めします。ZFに存在するという理由だけでZend_Dateを使用する理由は実際にはありません。PHP独自のDateTimeAPIは、より高速で使いやすくなっています。DateTimeAPIで時差を取得するには

$start = new DateTime("2011-09-06T10:00:00+02:00");
$end = new DateTime("2011-09-06T10:01:00+02:00");
echo $start->diff($end)->format('%H:%I:%S');

00:01:00を出力します

于 2011-09-06T09:40:02.663 に答える