1

假设我想增加一周,27-10-2012这样我就可以使用:

$week = 60*60*24*7;
$newdate = strtotime('27-10-2012') +$week;


或者我可以使用

$newdate = strtotime('+1 week',strtotime('27-10-2012'));


或者:

$date = new DateTime('2012-10-27');
$date->add(new DateInterval('P7D'));

那么有什么区别,尤其是在使用周而不是月时?

参考:-
http://www.php.net/manual/en/function.strtotime.php
http://www.php.net/manual/en/function.date.php
及其函数签名。

4

5 回答 5

1

从纯代码的角度来看,它们都具有相同的值:

<?php
    $week = 60*60*24*7;
    $newdate = strtotime('27-10-2012') +$week;

    echo $newdate;
    echo '<br>';

    $newdate = strtotime('+1 week',strtotime('27-10-2012'));

    echo $newdate;
    echo '<br>';

    $date = new DateTime('2012-10-27');
    $date->add(new DateInterval('P7D'));

    echo strtotime($date->format('d-m-Y'));
?>

输出:

1351900800
1351900800
1351900800

从性能的角度来看,它有点不同。

方法1重复10.000次耗时0.025587s

方法2重复10.000次耗时0.12083s

方法3重复10.000次耗时0.05738s

在任何情况下,它都非常小,您无需担心。现在,问问自己:哪一个更具可读性?

于 2012-10-27T20:09:30.827 回答
0

性能上可能存在差异,但是(除非代码在一个大循环中)对开发人员来说最重要的差异将是可读性。试着想象一下自己 1 年后,当你要更新你的代码时,你会看到:

$date->add(new DateInterval('P7D'));

那边的那条线说:在我的日期上加上一个间隔,一个等于“P7D”的间隔……不管那是什么意思。

或者你可以看到这个:

$week = 60*60*24*7;
$newdate = strtotime('27-10-2012') +$week;

想一想,好的,我在那个日期添加了一个变量 $week 。一周等于每分钟 60 秒、每小时 60 分钟、每天 24 小时和每周 7 天。是的,没错。

或者你可以看到:

$newdate = strtotime('+1 week',strtotime('27-10-2012'));

并说: $newdate 等于 27-10-2012 之后的一周... NEXT!

PHP 本身就已经够乱了,不要让他变得更混乱。

关于性能,您可以确定这三者之间不会有重大差异,尽管strtotime('+1 week'...需要new DateInterval('P7D')进行一些文本解析,因此可能会出现一些问题。

于 2012-10-27T20:01:19.413 回答
0

如果您正在谈论性能方面/内存使用情况,那么您的第一个示例可能是最直接的和内存意识的。话虽这么说,差异很小,除非您循环访问数千个结果并解析日期,否则您不会注意到任何差异。

对象很棒,但它们确实使用更多的内存,因为它们具有更多的功能和能力。 DateTime是一个很好用的对象,但是当做一些简单的事情时,比如给一个日期加上一周,strtotime就足够了。例如,您可以步行到 1 个街区外的商店或乘坐豪华轿车……如果您所做的只是增加一周,这有点矫枉过正。

话虽如此,DateTime当涉及到不同地点的时区和时间时,我会尝试更频繁地使用。从这个意义上说,效果很好,绝对不是矫枉过正。

纯属个人意见。

于 2012-10-27T20:05:20.357 回答
0

处理几周很容易尝试一个月通常我会问自己这个问题..一个月有多少天或几周?肯定会走60*60*24*Number of days......因为每个月的每一天都不是固定的,所以你可能会罚款你自己有一些不准确

简单的编程错误

$newdate = time() + (60 * 60 * 24 * 28);
                                     ^-----Now you have look for num of days
var_dump(date("Y-m-d", $newdate)); //string '2012-11-24' (length=10)

$newdate = strtotime('+1 month', strtotime('27-10-2012'));
var_dump(date("Y-m-d", $newdate)); //string '2012-11-27' (length=10)

$newdate = new DateTime('2012-10-27');
$newdate->add(new DateInterval('P1M'));
var_dump($newdate->format("Y-m-d")); //string '2012-11-27' (length=10)

从示例编号 1 选项出来

另一方面.... PHP DOC说

m/d/y 或 dmy 格式的日期通过查看各个组件之间的分隔符来消除歧义:如果分隔符是斜杠 (/),则假定为美式 m/d/y;而如果分隔符是破折号 (-) 或点 (.),则假定为欧洲 dmy 格式。

为避免潜在的歧义,最好尽可能使用 ISO 8601 (YYYY-MM-DD) 日期或 DateTime::createFromFormat()。

我敢打赌DateTime::createFromFormat()这是处理日期最可靠的方式,因为您100%可以确定您在任何时间点传递的格式

于 2012-10-27T20:18:09.380 回答
0

我对@pikzen(2012 年)获得的结果有点惊讶,所以我使用strtotime(). 我认为这个问题不是从正确的角度考虑的。

如果我们要使用strtotime()时间戳,则应在执行任何操作之前从头开始转换时间戳。

EG我目前正在编写一个算法,该算法会在很长一段时间内创建重复的停电和假期,当然,需要大量的日期验证和操作。

我使用 PHP 7 进行了 1,000,000 次重复的小测试,结果如下:

日期添加测试结果

对于必须处理大量日期操作的复杂算法,在我看来,处理整数时间戳而不是字符串 DateTimes 有一点好处。

这是用于我的测试的代码:

set_time_limit(180); //3 minutes

echo "<style>table, tr, th, td {border-style:solid; padding:2px;}</style>" .
    "<h1>Date add using strtotime() 1,000,000 repetitions</h1>" . 
    "<table><b><tr style='background-color:LavenderBlush;'><th>Unit</th>" .
    "<th>String date with conversion</th><th>String date w/o conversion</th>" . 
    "<th>Timestamp with conversion</th><th>timestamp w/o conversion</th></tr></b>";


//add day
echo "<tr style='background-color:aqua;'><td><b>Day</b></td>";

$date = date("Y-m-d");

$test = microtime(true);

for ($i = 0; $i < 1000000; $i++) {

    $date = date('Y-m-d', strtotime($date . '+1 day'));
}

echo "<td>" . (microtime(true) - $test) . "</td>";

$date = date("Y-m-d");

$test = microtime(true);

for ($i = 0; $i < 1000000; $i++) {

    $newDate = strtotime($date . '+1 day');
}

echo "<td>" . (microtime(true) - $test) . "</td>";


$date = strtotime(date("Y-m-d"));

$test = microtime(true);

for ($i = 0; $i < 1000000; $i++) {

    $newDate = date('Y-m-d', strtotime('+1 day', $date));
}

echo "<td>" . (microtime(true) - $test) . "</td>";


$date = strtotime(date("Y-m-d"));

$test = microtime(true);

for ($i = 0; $i < 1000000; $i++) {

    $date = strtotime('+1 day', $date);
}

echo "<td>" . (microtime(true) - $test) . "</td><tr>";


//add week
echo "<tr style='background-color:LightCyan;'><td><b>Week</b></td>";

$date = date("Y-m-d");

$test = microtime(true);

for ($i = 0; $i < 1000000; $i++) {

    $date = date('Y-m-d', strtotime($date . '+1 week'));
}

echo "<td>" . (microtime(true) - $test) . "</td>";

$date = date("Y-m-d");

$test = microtime(true);

for ($i = 0; $i < 1000000; $i++) {

    $newDate = strtotime($date . '+1 week');
}

echo "<td>" . (microtime(true) - $test) . "</td>";


$date = strtotime(date("Y-m-d"));

$test = microtime(true);

for ($i = 0; $i < 1000000; $i++) {

    $newDate = date('Y-m-d', strtotime('+1 week', $date));
}

echo "<td>" . (microtime(true) - $test) . "</td>";


$date = strtotime(date("Y-m-d"));

$test = microtime(true);

for ($i = 0; $i < 1000000; $i++) {

    $date = strtotime('+1 week', $date);
}

echo "<td>" . (microtime(true) - $test) . "</td><tr>";


//add month
echo "<tr style='background-color:LightGreen;'><td><b>Month</b></td>";

$date = date("Y-m-d");

$test = microtime(true);

for ($i = 0; $i < 1000000; $i++) {

    $date = date('Y-m-d', strtotime($date . '+1 month'));
}

echo "<td>" . (microtime(true) - $test) . "</td>";

$date = date("Y-m-d");

$test = microtime(true);

for ($i = 0; $i < 1000000; $i++) {

    $newDate = strtotime($date . '+1 month');
}

echo "<td>" . (microtime(true) - $test) . "</td>";


$date = strtotime(date("Y-m-d"));

$test = microtime(true);

for ($i = 0; $i < 1000000; $i++) {

    $newDate = date('Y-m-d', strtotime('+1 month', $date));
}

echo "<td>" . (microtime(true) - $test) . "</td>";


$date = strtotime(date("Y-m-d"));

$test = microtime(true);

for ($i = 0; $i < 1000000; $i++) {

    $date = strtotime('+1 month', $date);
}

echo "<td>" . (microtime(true) - $test) . "</td><tr>";



//add year
echo "<tr style='background-color:LightGoldenRodYellow;'><td><b>Year</b></td>";

$date = date("Y-m-d");

$test = microtime(true);

for ($i = 0; $i < 1000000; $i++) {

    $date = date('Y-m-d', strtotime($date . '+1 year'));
}

echo "<td>" . (microtime(true) - $test) . "</td>";

$date = date("Y-m-d");

$test = microtime(true);

for ($i = 0; $i < 1000000; $i++) {

    $newDate = strtotime($date . '+1 year');
}

echo "<td>" . (microtime(true) - $test) . "</td>";


$date = strtotime(date("Y-m-d"));

$test = microtime(true);

for ($i = 0; $i < 1000000; $i++) {

    $newDate = date('Y-m-d', strtotime('+1 year', $date));
}

echo "<td>" . (microtime(true) - $test) . "</td>";


$date = strtotime(date("Y-m-d"));

$test = microtime(true);

for ($i = 0; $i < 1000000; $i++) {

    $date = strtotime('+1 year', $date);
}

echo "<td>" . (microtime(true) - $test) . "</td><tr></table>";


//string date comparation 

echo "<br /><h1>Date comparission with 1,000,000 repetition</h1>";


$date = date("Y-m-d");

$i = 0;

$newDate = date('Y-m-d', strtotime($date . '+1 year'));

$test = microtime(true);

while ($i < 1000000) {

    if ($date !== $newDate) {

        $i++;
    }
}

echo "<br / ><b>String date comparission:</b> " . (microtime(true) - $test) . "<br />";


//timestamp comparision

$date = strtotime($date);

$i = 0;

$newDate = strtotime($newDate);

$test = microtime(true);

while ($i < 1000000) {

    if ($date !== $newDate) {

        $i++;
    }
}

echo "<b>timestamp comparission:</b> " . (microtime(true) - $test) . "<br />";
于 2017-09-28T19:16:47.983 回答