2014-11-04 147 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,等你的比较。

只需显示此选项作为其他选项(这将起作用)的替代方法,因为如果您需要处理大量的间隔时间段,则此选项可以更具可扩展性。