Почему углерод addMinutes делает плохое дополнение
В среде 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
Кто-нибудь может увидеть очевидное, что я скучаю здесь с обработкой углерода? Я совершенно уверен, что это связано с углеродом, как я реструктурировал выше 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);
WEIRD - теперь начало правильное, но конец все еще неправильный (отображается 2018-07-06 01:00:00)
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);
Дает мне следующее:
Массив ( [0] => Массив ([начало] => 2018-07-05 21:50:00 [конец] => 2018-07-05 22:30:00))