2017-06-26 61 views
2

我寫的代碼,會做3個查詢選擇在30天內到期的項目60天和90天:DATETIME() - >子/加VS DateTime->修改

$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%認爲他的方式意味着性能會提高(即使性能受到影響,我們會採取任何一種方式 可以忽略不計)。

如果任何人都可以提供哪種方式更好的證據(無論哪種方式都是可取的),我將不勝感激!

+1

我認爲,處理時間/花費在處理與datetime對象的任一方法的資源將是杯水車薪與執行相查詢並返回結果。 –

+0

這是完全正確的,整個論證的基礎是有點愚蠢的,但我想使用新的'add'函數而不是'modify'函數,而「這是新的方法」並不是對他來說似乎是一個足夠好的理由,所以我正在尋找其他的優點或缺點。 – Skytiger

回答

2

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

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

至於性能更可讀的,下面是一個代碼來測試它與結果是:

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

$ DT->添加(新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";