正确的添加天数的方法

时间:2013-10-22 12:22:58

标签: php strtotime

我已经尝试将7天添加到2013-10-26并重新回到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那么你会发现它是10p.m.由于某种原因,它会产生影响。

我正在使用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');

谢谢。但是仍然存在一个问题,即它从一开始就无法正常工作。

5 个答案:

答案 0 :(得分: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

Demo!

答案 1 :(得分:1)

您可以使用DateTime类来操作日期:

function add($date, $years = 0, $months = 0, $days = 0)
{
    return date_create($date)->modify("$years year $months month $days day")->format('Y-m-d');
}

<强> Demo


  

但是仍然存在一个问题,即它从一开始就无法正常工作。

因为您正在使用date函数,该函数是时区和DST感知,并与strtotime结合使用。对于您的示例,您可以使用始终以UTC / GMT返回时间的gmdate


Speed test different combinations,你会看到最快的一个是gmdate+strtotime组合。我在1M循环上运行:

addDays_v1 needed 4.5433s
addDays_v2 needed 7.4234s
addDays_v3 needed 7.6924s
addDays_v4 needed 24.1624s

答案 2 :(得分:0)

尝试

return date('Y-m-d', strtotime("+7 day",$date));

答案 3 :(得分:0)

你可以这样试试 -

<?php
$date = date_create('2000-01-01');
date_add($date, date_interval_create_from_date_string('7 days'));
echo date_format($date, 'Y-m-d');
?>

Reff:http://in1.php.net/manual/en/datetime.add.php

答案 4 :(得分:-3)

将最后一行更改为:

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

一切都很好。我有2013-11-02。