2014-11-04 123 views
1

這到底如何?關於堆棧溢出的問題,我想要做的事情有很多。然而所有的解決方案都是編輯MYSQL查詢,我需要從PHP內部完成。PHP - 基於時間的數學計算

我在另一個問題上了解了strtotime(' - 30 days')方法並嘗試了它,但我無法得到任何結果。這裏就是我想:

$current_date = date_create(); 
$current_date->format('U'); 
... mysql code ... 
$transaction_date = date_create($affiliate['Date']); 
$transaction_date->format('U'); 
if($transaction_date > ($current_date - strtotime('-30 days'))) { 
} else if(($transaction_date < (($current_date) - (strtotime('-30 days')))) 
      && ($transaction_date > (($current_date) - (strtotime('-60 days'))))) { 
} 

實際上,我想所有的排序基於日期在數據庫中的數據,如果數據庫條目已在最近30天發佈,我想執行一個函數,然後我想查看數據庫條目是否超過30天,但不超過60天,並執行更多操作。

這個時代的數學真的很奇怪,你會認爲獲得當前時代的紀元,數據輸入的時代以及30和60天前的時代將足夠做我想做的事情,但由於某種原因,它無法正常工作,即使我將數據庫中的日期設置爲去年,所有事情都會以不到30天的時間返回。

+1

'date_create(date(...))'完全沒有意義。你讓PHP從'ti​​me()'獲取當前時間戳,將其格式化爲字符串'date(...)',然後使用date_create將其解析爲時間戳/對象。如果你想「現在」,所有你需要的是'date_create()'。 – 2014-11-04 17:54:02

+0

好的,謝謝你提供的信息,但我仍然對數學部分感到困惑。 – Hobbyist 2014-11-04 17:55:11

+1

「我需要從PHP內部完成」?爲什麼?如果你是MySQL查詢,*使用mysql的日期過濾器*來獲得你的範圍。除非你可以想出一個無法實現的真正可靠原因(並且如果你可以查詢mysql,那麼你就可以這麼做),沒有理由試圖迫使一個方形釘子通過圓孔。 – 2014-11-04 17:56:52

回答

2

無需轉換爲UNIX時間戳,你已經可以比較DateTime對象:

$current_date = data_create(); 
$before_30_day_date = date_create('-30 day'); 
$before_60_day_date = date_create('-60 day'); 
$transaction_date = date_create($affiliate['Date']); 

if ($transaction_date > $before_30_day_date) { 
    # transation date is between -30 day and future 
} elseif ($transaction_date < $before_30_day_date && $transaction_date > $before_60_day_date) { 
    # transation date is between -60 day and -30 day 
} 
+0

儘管Marc先回答並提供瞭解釋爲什麼它不起作用的解釋,但您提供了一個可用的代碼示例,謝謝。 – Hobbyist 2014-11-04 18:09:38

1

這將創建(低效,見上面我的意見)的對象:

$current_date = date_create(date("Y-m-d H:i:s")); 

從中你嘗試減去整數:

if($transaction_date > ($current_date - strtotime('-30 days'))) { 

這基本上是

if (object > (object - integer)) 

這沒有意義。

你在混合舊學校time()純粹處理unix時間戳的系統,以及新的處理對象的DateTime對象系統。

你應該有什麼是

$current_date = date_create(); // "now" 

$d30 = new DateInterval('P30D'); // 30 days interval 

$transaction_date = date_create($affiliate['Date']); 

if ($transaction_date > ($current_date->sub($d30)) { ... } 
+0

執行$ current_date-> sub時,這隻會執行並返回數學,還是實際上是從日期減去30,使$ current_date在30天內減少?我在問,因爲我需要知道在執行下一次計算之前是否必須將30天添加到$ current_date。感謝關於我如何使用對象的解釋,這是有道理的,爲什麼它不能正常工作時,它是這樣的。 – Hobbyist 2014-11-04 18:03:56

+0

它將修改後的時間值作爲新對象返回,並且不會觸及原始對象。如果你需要修改原文,那麼你必須做'$ d = $ d-> sub($ interval)'。 – 2014-11-04 18:04:29

+0

@MarcB:不正確,方法'sub()'更改原始對象。因此,他需要加回30天,才能返回到當前日期... – 2014-11-04 18:05:37

0

你可能會考慮DatePeriod類,這在本質上給你能夠以指定的時間間隔處理日期時間對象的系列。

$current_date = new DateTime(); 
$negative_thirty_days = new DateInterval::createFromDateString('-30 day'); 
$date_periods = new DatePeriod($current_date, $negative_thrity_days, 3); 
$thirty_days_ago = $date_periods[1]; 
$sixty_day_ago = $date_periods[2]; 

在這裏,你會用$thirty_days_ago$sixty_days_ago,等你的比較。

只需顯示此選項作爲其他選項(這將起作用)的替代方法,因爲如果您需要處理大量的間隔時間段,則此選項可以更具可擴展性。