簡體   English   中英

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

[英]DateTime()->sub/add vs DateTime->modify

我正在編寫代碼,將執行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。 我不同意他的推理主要是因為 - >修改是一種較舊的日期修改方式,而且我並不是100%確信他的方式意味着性能的提高(即使我們采取的任何一種方式都會受到影響可忽略不計)。

如果有人能提供哪種方式更好的證據(無論哪種方式都歡迎),我將非常感激!

兩種方式都是相同的,如何編寫代碼是一種品味問題。

根據我的口味, $dt->modify('+5 days')$dt->add(new DateInterval("P5D"))更具可讀性

至於性能,下面是測試它的代碼,結果如下:

$ dt-> modify('+ 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";

但是沒有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}'");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM