-2

我尝试将 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 那么你会发现它是晚上 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类来操作日期:

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

演示


但是仍然存在为什么它从一开始就不能正常工作的问题。

因为您使用date的是时区和 DST 感知的函数,而与strtotimewhich is not 结合使用。对于您的示例,您可以使用gmdate它将始终返回 UTC/GMT 时间。


速度测试不同的组合,你会发现最快的是gmdate+strtotime组合。我在 1M 循环上运行:

addDays_v1 needed 4.5433s
addDays_v2 needed 7.4234s
addDays_v3 needed 7.6924s
addDays_v4 needed 24.1624s
于 2013-10-22T12:30:21.587 回答
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 回答
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');
?>

参考: http ://in1.php.net/manual/en/datetime.add.php

于 2013-10-22T12:30:27.970 回答
0

试试喜欢

return date('Y-m-d', strtotime("+7 day",$date));
于 2013-10-22T12:24:31.163 回答
-3

将最后一行更改为:

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

一切正常。我有我的 2013-11-02。

于 2013-10-22T12:22:58.140 回答