为什么 carbon addMinutes 加法不好
Why is carbon addMinutes doing bad addition
在 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);
所以 150 分钟是 2 小时 30 分钟,190 分钟是 3 小时 10 分钟,所以我假设如下
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)
看看这段代码:
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 ) )
在 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);
所以 150 分钟是 2 小时 30 分钟,190 分钟是 3 小时 10 分钟,所以我假设如下
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)
看看这段代码:
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 ) )