【问题标题】:PHP date to timestamp conversion not working as expectedPHP日期到时间戳的转换没有按预期工作
【发布时间】:2013-05-01 09:27:36
【问题描述】:

我有以下函数,它应该只是将周数添加到开始日期并返回结束日期,但是对于大于 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 

【问题讨论】:

标签: php date datetime unix-timestamp


【解决方案1】:

虽然我认为最简单的方法是使用 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 天。

希望对你有帮助。

【讨论】:

    【解决方案2】:

    首先,您需要了解您的开始日期和第一个截止日期之间的差异 - 第一个日期算在 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");
    }
    

    这将从$start_date 算出日期$interval_term 周 - 前两点仍然存在。

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

    【讨论】:

    • 不,我在函数的区间项中有 -1,它返回 2013-11-07;正如您在付款时间表中看到的,它将于 2013 年 10 月 31 日结束;即使我换成你的,我仍然会遇到同样的错误,我不知道为什么它提前一周我已经扣除了 -1
    • 另一方面,如果我从间隔中减去 -2,那么 4 周的时间表将返回 2013-6-13,这比正确日期低一周...
    • 如果 2013 年 5 月 30 日是您的开始日期,那么 2013 年 10 月 31 日是 22 周后。如果您希望它是 24 周,那是不正确的。 2013 年 10 月 31 日之后的 23 周是 2013 年 7 月 11 日。 but the correct 24 week from the start_date is 2013-10-31 这行不正确 - 它是 22 周,如果你包括第一周它是 23 - 但是将在一周前确定真正的开始日期 - 即 23/05/2013。
    • (如果你想这样做,我只需在函数顶部添加一个$interval_term--。但实际上你需要了解你在做什么而不是你在做什么正在尝试做。
    猜你喜欢
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    • 2021-01-05
    • 2013-12-17
    • 2013-09-12
    • 2012-08-28
    • 1970-01-01
    相关资源
    最近更新 更多