DateTime()->sub/add 与 DateTime->modify

问题描述 投票:0回答:3

我正在编写代码,该代码将执行 3 个查询来选择在 30 天、60 天和 90 天内过期的项目:

$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% 相信他的方式将意味着性能的提高(即使性能受到影响,我们也会采取任何一种方式 可以忽略不计)。

如果有人可以提供证据证明哪种方式更好(无论哪种方式都受欢迎),我将不胜感激!

php datetime intervals
3个回答
4
投票

两种方式都差不多,只是如何编写代码而已。

就我的口味而言,

$dt->modify('+5 days')
$dt->add(new DateInterval("P5D"))

更具可读性

至于性能,下面是测试代码,结果是:

$dt->修改('+5天') - 0.0503秒

$dt->add(new DateInterval("P5D")) - 0.0572 秒

因此,对于问题中的情况,可读代码也是非常小更快:)

<?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";

0
投票

但是没有

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}'");

0
投票

请人们,看在上帝的份上,不要对 PHP 代码进行微优化。我们可能正在谈论微秒级的差异,正如其他人指出的那样,无论如何,大部分时间都花在数据库查询上。在超过 25 年的 PHP 编程经验中,我可以用一只手数出应用程序速度缓慢的情况,因为时间花在 PHP 代码本身上,而不是外部 API 调用、数据库查询等。这甚至是在当前的 PHP 之前版本,比 PHP 3 快几个数量级。其中一种情况是失控循环,所以基本上是一个编程错误。如果您遇到 PHP 代码实际上很慢的情况,请使用分析器来识别瓶颈。正如比我更好的程序员所指出的,“过早的优化是万恶之源”。

恕我直言,您应该优化 PHP 代码的可读性和可维护性,而不是为了性能。反对 DateInterval 的一个很好的论点是,并非每个程序员都熟悉它,因此,$datetime->add(new DateInterval('PT1H')) 的可读性不如 $datetime->modify('+ 1 hour' ).

© www.soinside.com 2019 - 2024. All rights reserved.