PHP日期到时间戳转换无法按预期工作

时间:2013-05-01 09:27:37

标签: php date datetime unix-timestamp

我有以下功能,它应该只添加开始日期的周数并返回结束日期,但是我的错误结束日期大于20,

例如

开始日期='2013-05-30'
interval_term = 24;

将以

的形式返回

结束日期:2013-11-07

功能如下,

public function calculateArrangementEndDate($interval_term=12,$start_date=false)
{
    $end_date=($start_date===false)?time():strtotime($start_date);
    return date("Y-m-d",($end_date+($interval_term-1)*3600*7*24));
}

但是start_date的正确24周是 2013年10月31日

像这样

付款时间表:

Due Date       Amount
30/05/2013     $0.64
06/06/2013     $0.64
13/06/2013     $0.64
20/06/2013     $0.64
27/06/2013     $0.64
04/07/2013     $0.64
11/07/2013     $0.64
18/07/2013     $0.64
25/07/2013     $0.64
01/08/2013     $0.64
08/08/2013     $0.64
15/08/2013     $0.64
22/08/2013     $0.64
29/08/2013     $0.64
05/09/2013     $0.64
12/09/2013     $0.64
19/09/2013     $0.64
26/09/2013     $0.64
03/10/2013     $0.64
10/10/2013     $0.64
17/10/2013     $0.64
24/10/2013     $0.64
31/10/2013     $0.64 

2 个答案:

答案 0 :(得分:0)

我虽然简单的方法是使用strtotime来添加这24周而不是使用

$enddate = strtotime('2013-05-30 00:00:00 +24 weeks');
var_dump(date('Y-m-d H:i:s', $enddate));

将返回“2013-11-14 00:00:00”

如果您尝试2周进行简单测试,您将获得2013-06-13 00:00:00,这正好是14天。

我希望它有所帮助。

答案 1 :(得分:0)

首先,您需要了解开始日期和第一个截止日期之间的差异 - 这是24个月内计算的第一个吗?如果是这样,那么您希望该术语实际上是23个月吗? 24 weeks after 30/05/2013 is indeed 14/11/2013

您的付款时间表中只列出了23个日期(但从开始日期开始,如果有意义的话,不将其作为第一个截止日期使用)。

最后,我建议改用DateTime类。这是一个例子:

public function calculateArrangementEndDate($interval_term=12,$start_date=false)
{
  $date = new DateTime($start_date);
  if (is_null($date)) {
    // throw exception or return false here
  }

  $date->add(new DateInterval('P' . $interval_term . 'W'));
  return $date->format("Y-m-d");
}

这将计算$interval_term周的$start_date周的日期 - 前两个点仍然存在。

var_dump(
  calculateArrangementEndDate(23, '2013-05-30')
);
// string(10) "2013-11-07"