在PHP中添加月份到日期时间会产生意外结果

时间:2018-02-26 06:41:18

标签: php datetime

我们的用户可以在日历中添加他们的空闲时间,他们只需要标记1周的时间。我必须创建一个for循环,以获得所有用户的开始和结束时间并添加1个月(最多三个月),这样我就可以获得增加月份的开始和结束时间。所以,让我们说用户在数据库中添加了时间戳(目前只有1个用于测试,但可能有很多)是

startTime = 2018-02-28 08:00:00 - endtime = 2018-02-28 08:30:00  

然后我需要显示这样的时间:

2018-02-28 08:00:00 - 2018-02-28 08:30:00 
2018-03-28 08:00:00 - 2018-03-28 08:30:00 
2018-04-28 08:00:00 - 2018-04-28 08:30:00 
2018-05-28 08:00:00 - 2018-05-28 08:30:00 

这就是我的尝试。

//一直得到

$times = Nanny_availability::where('user_id', user()->id)->get();

foreach($times as $time)
    {
    $start_times[] = new DateTime($time['start_time']);
    $end_times[] = new DateTime($time['end_time']);
    $available_times[] = $time['start_time'] . ' - ' . $time['end_time'];
    }

// add months

foreach($start_times as $start_time)
    {

    // add six months times interval

    for ($x = 0; $x <= 3; $x++)
        {
        $sixMonthsStart[] = $start_time->add(new DateInterval("P" . $x . "M"));
        }
    }

return Response::json($sixMonthsStart);

这是我的json回复。

[  
   {  
      "date":"2018-08-28 08:00:00.000000",
      "timezone_type":3,
      "timezone":"Europe/Helsinki"
   },
   {  
      "date":"2018-08-28 08:00:00.000000",
      "timezone_type":3,
      "timezone":"Europe/Helsinki"
   },
   {  
      "date":"2018-08-28 08:00:00.000000",
      "timezone_type":3,
      "timezone":"Europe/Helsinki"
   },
   {  
      "date":"2018-08-28 08:00:00.000000",
      "timezone_type":3,
      "timezone":"Europe/Helsinki"
   }
]

如何添加月份?

3 个答案:

答案 0 :(得分:0)

您需要使用DateTimeImmutable。来自php文档:

  

此类与DateTime的行为相同,只是它从不修改自身,而是返回一个新对象。

基本上每次在DateTime对象上调用add时,都会改变基础对象,并且在for循环的下一次迭代中,您不再拥有与之相同的日期。 因此,您可以在每次迭代时使用DateTimeImmutable或按月增加1

答案 1 :(得分:0)

可以通过这种方式增加月份:

$fmt = 'Y-m-d H:i:s'; // Date format

// Start with a timestamp, such as time() or strtotime($time['start_time'])
$t = time();
print(date($fmt, $t)."\n");

for ($i=0; $i<3; $i++) {

    // Feed the string datetime with a text instruction to strtotime()
    $t = strtotime(date($fmt, $t).' +1 Month');

    // Print resulting date, or store somewhere
    print(date($fmt, $t)."\n");
}

运行时从此脚本输出:

2018-03-26 03:17:58
2018-04-26 03:17:58
2018-05-26 03:17:58

答案 2 :(得分:0)

您的问题是您在每次迭代中修改并分配相同的$start_time对象。 add()方法不会返回新的DateTime对象。

使用clone关键字尝试此方法来制作对象的副本:

for ($x = 0; $x <= 6; $x++)
{
    $date = clone $start_date;
    $dates[] = $date->modify("+$x months");
}