DateTime()->sub/add vs DateTime->修改
DateTime()->sub/add vs DateTime->modify
我正在编写代码,将对 select 在 30 天、60 天和 90 天内过期的项目进行 3 次查询:
$arrDates = array("30"=>array(), "60"=>array(), "90"=>array());
$sDateFormat = 'Y-m-d';
$sQuery = "SELECT *
FROM `table
WHERE `expiry_date` BETWEEN "; // Ranges will be added later
foreach ($arrDates as $sInterval=>$arrContainer)
{
$dtStart = new DateTime();
$dtEnd = new DateTime();
$sRangeStart = $dtStart->add(new DateInterval("P{$sInterval}D"))->format("{$sDateFormat} 00:00:00");
$sRangeEnd = $dtEnd->add(new DateInterval("P{$sInterval}D"))->format("{$sDateFormat} 23:59:59");
$arrDates[$sInterval] = fetch_all($sQuery . "'{$sRangeStart}' AND '{$sRangeEnd}'");
}
这段代码没有任何问题。一位同事建议我替换 foreach 循环中的代码
具有以下内容:
$dtStart = new DateTime();
$dtEnd = new DateTime();
$dtStart->modify("+{$sInterval} days")->setTime(0, 0, 0)->format("{$sDateFormat} 00:00:00");
$dtEnd->modify("+{$sInterval} days")->setTime(23, 59, 59)->format("{$sDateFormat} 23:59:59");
$arrDates[$sInterval] = fetch_all($sQuery . "'{$sRangeStart}' AND '{$sRangeEnd}'");
他做出此更改的原因是,这意味着不必在每个循环中都实例化 2 个 DateIntervals。
我不同意他的推理,主要是因为 ->modify 是一种较旧的日期修改方式,我不是 100%
确信他的方式将意味着性能的提高(即使性能受到影响我们会采取任何一种方式
可以忽略不计)。
如果有人能提供证据证明哪种方式更好(无论哪种方式都欢迎),我将不胜感激!
两种方式都差不多,看代码怎么写了。
对我来说 $dt->modify('+5 days')
比 $dt->add(new DateInterval("P5D"))
更具可读性
至于性能,下面是测试它的代码,结果是:
$dt->modify('+5 days') - 0.0503 sec
$dt->add(new DateInterval("P5D")) - 0.0572 sec
所以,对于问题的情况,可读代码也是非常小更快的代码:)
<?php
$i = 0;
$start = microtime(true);
while($i++ < 10000) {
$date = new DateTime('2018-02-13');
$date->modify('+5 days');
}
$end = microtime(true);
echo $end - $start, "\n";
$i = 0;
$start = microtime(true);
while($i++ < 10000) {
$date = new DateTime('2018-02-13');
$date->add(new DateInterval('P5D'));
}
$end = microtime(true);
echo $end - $start, "\n";
但是没有setTime()
不一样吗?
$dtStart = new DateTime();
$dtEnd = new DateTime();
$dtStart->modify("+{$sInterval} days")->format("{$sDateFormat} 00:00:00");
$dtEnd->modify("+{$sInterval} days")->format("{$sDateFormat} 23:59:59");
$arrDates[$sInterval] = fetch_all($sQuery . "'{$sRangeStart}' AND '{$sRangeEnd}'");
我正在编写代码,将对 select 在 30 天、60 天和 90 天内过期的项目进行 3 次查询:
$arrDates = array("30"=>array(), "60"=>array(), "90"=>array());
$sDateFormat = 'Y-m-d';
$sQuery = "SELECT *
FROM `table
WHERE `expiry_date` BETWEEN "; // Ranges will be added later
foreach ($arrDates as $sInterval=>$arrContainer)
{
$dtStart = new DateTime();
$dtEnd = new DateTime();
$sRangeStart = $dtStart->add(new DateInterval("P{$sInterval}D"))->format("{$sDateFormat} 00:00:00");
$sRangeEnd = $dtEnd->add(new DateInterval("P{$sInterval}D"))->format("{$sDateFormat} 23:59:59");
$arrDates[$sInterval] = fetch_all($sQuery . "'{$sRangeStart}' AND '{$sRangeEnd}'");
}
这段代码没有任何问题。一位同事建议我替换 foreach 循环中的代码 具有以下内容:
$dtStart = new DateTime();
$dtEnd = new DateTime();
$dtStart->modify("+{$sInterval} days")->setTime(0, 0, 0)->format("{$sDateFormat} 00:00:00");
$dtEnd->modify("+{$sInterval} days")->setTime(23, 59, 59)->format("{$sDateFormat} 23:59:59");
$arrDates[$sInterval] = fetch_all($sQuery . "'{$sRangeStart}' AND '{$sRangeEnd}'");
他做出此更改的原因是,这意味着不必在每个循环中都实例化 2 个 DateIntervals。 我不同意他的推理,主要是因为 ->modify 是一种较旧的日期修改方式,我不是 100% 确信他的方式将意味着性能的提高(即使性能受到影响我们会采取任何一种方式 可以忽略不计)。
如果有人能提供证据证明哪种方式更好(无论哪种方式都欢迎),我将不胜感激!
两种方式都差不多,看代码怎么写了。
对我来说 $dt->modify('+5 days')
比 $dt->add(new DateInterval("P5D"))
至于性能,下面是测试它的代码,结果是:
$dt->modify('+5 days') - 0.0503 sec
$dt->add(new DateInterval("P5D")) - 0.0572 sec
所以,对于问题的情况,可读代码也是非常小更快的代码:)
<?php
$i = 0;
$start = microtime(true);
while($i++ < 10000) {
$date = new DateTime('2018-02-13');
$date->modify('+5 days');
}
$end = microtime(true);
echo $end - $start, "\n";
$i = 0;
$start = microtime(true);
while($i++ < 10000) {
$date = new DateTime('2018-02-13');
$date->add(new DateInterval('P5D'));
}
$end = microtime(true);
echo $end - $start, "\n";
但是没有setTime()
不一样吗?
$dtStart = new DateTime();
$dtEnd = new DateTime();
$dtStart->modify("+{$sInterval} days")->format("{$sDateFormat} 00:00:00");
$dtEnd->modify("+{$sInterval} days")->format("{$sDateFormat} 23:59:59");
$arrDates[$sInterval] = fetch_all($sQuery . "'{$sRangeStart}' AND '{$sRangeEnd}'");