为什么碳addMinutes做不好的加法

时间:2018-07-04 14:20:44

标签: php arrays php-carbon array-map

在Laravel环境中,我会增加一些时间,但并不能满足我的期望。

在下面的array_map函数中,发生了一些奇怪的addMinutes

$d = array_map(function ($date) {
    $base = Carbon::parse($date['time']);
    return [
        'start' => $base->addMinutes(150)->toDateTimeString(),
        'end' => $base->addMinutes(190)->toDateTimeString()
    ]
}, $dates);

所以150mins是2hrs30mins,190mins是3hrs10mins,所以我假设以下内容

2018-07-05 19.20.00 (+150 mins) -> start = 2018-07-05 21.50
                    (+190 mins) -> end   = 2018-07-05 22.30

我实际上是

2018-07-05 19.20.00 (+150 mins) -> start = 2018-07-05 21.30
                    (+190 mins) -> end   = 2018-07-06 00.40

有人可以看到我在Carbon处理过程中缺少的明显之处吗?我敢肯定,这与Carbon有关,因为我将上述array_map重组为foreach,并用相同的addMinutes得到了相同的结果。

编辑:

我刚刚将以下代码粘贴到phpio

中,以使任何人都可以修改该代码,以帮助诊断
require 'Carbon/Carbon.php';
use Carbon\Carbon;

$dates[] = ['time' => '2018-07-05 19:20:00'];

$d = array_map(function ($date) {
    $base = Carbon::parse($date['time']);
    return [
        'start' => $base->addMinutes(150)->toDateTimeString(),
        'end' => $base->addMinutes(190)->toDateTimeString()
    ];
}, $dates);

print_r($d);

奇怪-现在开始是正确的,但是结束仍然是不正确的(显示2018-07-06 01:00:00)

1 个答案:

答案 0 :(得分:1)

看看这段代码:

return [
    'start' => $base->addMinutes(150)->toDateTimeString(),
    'end' => $base->addMinutes(190)->toDateTimeString()
]

在两种情况下,您都将添加到$base中,因此,您要添加150分钟,然后再添加190分钟(因此总计340分钟)。尝试与->copy()一起使用:

return [
    'start' => $base->copy()->addMinutes(150)->toDateTimeString(),
    'end' => $base->copy()->addMinutes(190)->toDateTimeString()
]

phpio中使用以下代码:

require 'Carbon/Carbon.php';
use Carbon\Carbon;

$dates[] = ['time' => '2018-07-05 19:20:00'];

$d = array_map(function ($date) {
  $base = Carbon::parse($date['time']);
  return [
    'start' => $base->copy()->addMinutes(150)->toDateTimeString(),
    'end' => $base->copy()->addMinutes(190)->toDateTimeString()
  ];
}, $dates);

print_r($d);

请给我以下内容:

  

Array([0] => Array([start] => 2018-07-05 21:50:00 [end] => 2018-07-05 22:30:00))