Почему углерод addMinutes делает плохое дополнение - PullRequest
0 голосов
/ 04 июля 2018

В среде 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.

Edit:

Я только что адаптировал этот код для всех, чтобы помочь в диагностике, вставив приведенное ниже в 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 Ответ

0 голосов
/ 04 июля 2018

Посмотрите на этот код:

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))

...