2

この例の strtotime 関数の何が問題なのか、誰でも説明できますか? 日付の違いを数えようとしています。PHP 5.6.0 (cli) (ビルド: 2014 年 8 月 28 日 08:03:51) このループを実行すると、番号 88 が 2 回表示されます。

date_default_timezone_set('Europe/London');
for($i=1;$i<=100;$i++){
    $daysAfterTime = floor( abs( strtotime('2014-01-01') - strtotime('2014-01-01 +'.$i.' days')  )/(60*60*24));
    echo $daysAfterTime.'<br/>';
} 
4

3 に答える 3

5

strtotime()日付計算用ではありません。マニュアルにもそう書いてあります。

この関数を数学演算に使用することはお勧めできません。

日の長さは正確に60*60*24数秒ではありません。

コメントで述べたように、夏時間、うるう年などを考慮しているため、これにDateTime()はるかに適しています。 , を使用して同じ操作を実行する高度な方法を次に示しDateTime()ますDateInterval()DatePeriod()進んでいます。

$start    = new DateTimeImmutable('2014-01-01', new DateTimeZone('Europe/London'));
$finish   = $start->modify('+101 days'); // extra day as the last day is not inclusive
$interval = new DateInterval('P1D');     // interval of one day 
$period   = new DatePeriod($start, $interval, $finish);
foreach ($period as $date) {
    $diff = $start->diff($date);
    echo $diff->days . "<br>";
} 

デモ

于 2014-09-10T00:35:12.260 に答える
1
date_default_timezone_set('Europe/London');
echo (strtotime('2014-01-01 +89 days') - strtotime('2014-01-01 +88 days'))/(60*60), ' hours per day';
// 23 hours per day

ヨーロッパ/ロンドンのタイムゾーンはDSTを使用していると思います

ロンドンの夏時間に関する情報: http://www.timeanddate.com/time/zone/uk/london

var_dump(date('Y-m-d',strtotime('2014-01-01 +88 days')));
// string(10) "2014-03-30"

PS z でdateを使用すると、期待どおりに動作します。

date_default_timezone_set('Europe/London');
for($i=1;$i<=100;$i++){
    $daysAfterTime = date('z', strtotime('2014-01-01 +'.$i.' days')) - date('z', strtotime('2014-01-01'));
    echo $daysAfterTime.PHP_EOL;
}
于 2014-09-10T00:38:09.517 に答える
1

予想される出力が何であるかはわかりませんが、他の88の結果はそのfloor()機能によるものです。最低値を四捨五入したため、88 が繰り返されました。abs()使用して使用する必要がないように、代わりに増加する値から定数値を差し引いたものに切り替えますceil()

date_default_timezone_set('Europe/London');
for($i=1;$i<=100;$i++){
    $daysAfterTime = ceil((strtotime('2014-01-01 +'.$i.' days') - strtotime('2014-01-01'))/(60*60*24));
    echo $daysAfterTime.'<br/>';
}
于 2014-09-10T00:34:23.337 に答える