我已经尝试将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');
谢谢。但是仍然存在一个问题,即它从一开始就无法正常工作。
答案 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
答案 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');
?>
答案 4 :(得分:-3)
将最后一行更改为:
return date('Y-m-d', strtotime($date . ' 00:00:00 UTC') + 86400 * $days);
一切都很好。我有2013-11-02。