-2

2013-10-26 に 7 日間追加しようとしましたが、2013-11-01 に戻りました。しかし、それは 2013-11-02 でなければなりません。私の古い機能は次のようなものでした:

public static function add($date, $years = 0, $months = 0, $days = 0)
{
    $date = explode('-', $date);
    return date(
        'Y-m-d', 
        mktime(0, 0, 0, $date[1] + $months, $date[2] + $days, $date[0] + $years)
    );
}

これは正しかったのですが、遅すぎました。より専門的な新しいものを作成しました。

public static function adddays($date, $days = 1)
{
    if ($days == 0) return $date;
    return date('Y-m-d', strtotime($date) + 86400 * $days);
}

それはほとんど正しく動作します。この場合ではありません。strtotime('2013-10-26') % 86400 を計算すると、午後 10 時であることがわかります。そして、何らかの理由で違いが生じます。

バージョン 5.3.2 で作業しています。


速度テスト:

3 つのバージョンで 1000 回の実行を繰り返しました

DateTime : +7 day : strtotime

26ms : 43ms : 41ms
30ms : 44ms : 42ms
25ms : 42ms : 43ms
30ms : 48ms : 49ms

したがって、より多くの行とより速い結果が得られます。Amal の DateTime を選択します。

$date = new DateTime('2013-10-26');
$days_to_add = 7;
$date->add(new DateInterval('P' . $days_to_add . 'D'));
$date->format('Y-m-d');

ありがとうございました。しかし、なぜ最初から正しく機能しなかったのかという疑問が残ります。

4

5 に答える 5

1

最良の方法は、DateTimeクラスを使用することです。

$date = new DateTime('2013-10-26');
$days_to_add = 7;
$date->add(new DateInterval('P' . $days_to_add . 'D'));
echo $date->format('Y-m-d');

出力:

2013-11-02

デモ!

于 2013-10-22T12:27:41.277 に答える
-3

最後の行を次のように変更します。

return date('Y-m-d', strtotime($date . ' 00:00:00 UTC') + 86400 * $days);

そして、すべてがうまくいっています。2013-11-02 を持っています。

于 2013-10-22T12:22:58.140 に答える