Как получить разницу между двумя датами в неделях с Carbon - PullRequest
0 голосов
/ 20 апреля 2020

В приложении laravel 6 я хочу получить разницу между двумя датами в неделях: если даты разбивают неделю, получают значение> 0

Я вижу метод diffInWeeks, написанный здесь: https://carbon.nesbot.com/docs/#api -week

Имея 2 даты, я делаю:

$startDate = Carbon::createFromTimestamp(strtotime($eventItem['at_time']));//->format($date_format);
\Log::info('$startDate ::');
\Log::info(print_r($startDate, true));
$offset_x= $startDate->dayOfWeek;

$endDate = $startDate->add($eventItem['duration'] . ' minutes');
\Log::info('-1  $endDate::' . print_r($endDate, true));
$diff_in_weeks=  $startDate->diffInWeeks($endDate);
\Log::info('-3 $diff_in_weeks  ::' . print_r($diff_in_weeks, true));

В журналах:

[2020-04-20 06:16:56] local.INFO: $startDate ::  
[2020-04-20 06:16:56] local.INFO: Carbon\Carbon Object
(
    [date] => 2018-02-01 09:08:39.000000
    [timezone_type] => 3
    [timezone] => UTC
)

[2020-04-20 06:16:56] local.INFO: -1  $endDate::Carbon\Carbon Object
(
    [date] => 2018-02-22 04:28:39.000000
    [timezone_type] => 3
    [timezone] => UTC
)

[2020-04-20 06:16:56] local.INFO: -3 $diff_in_weeks  ::0  

Но в выводе выше я вижу, что с разницей в 21 день $ diff_in_weeks = = 0

Я пытался заменить даты:

$diff_in_weeks= $endDate->diffInWeeks($startDate);

и все равно получил 0 ...

Какой путь правильный?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 20 апреля 2020

Потому что, когда вы используете $endDate = $startDate->add($eventItem['duration'] . ' minutes');
Дата начала ($ startDate) также меняет свое значение, и из этой строки дата начала имеет новое значение, и фактически дата начала равна дате окончания , Итак, ваше решение:

$startDate = Carbon::createFromTimestamp(strtotime($eventItem['at_time']));


$endDate = Carbon::createFromTimestamp(strtotime($eventItem['at_time']))->add($eventItem['duration'] . ' minutes');


$diff_in_weeks=  $startDate->diffInWeeks($endDate);


2 голосов
/ 20 апреля 2020

Поскольку неделя составляет 7 дней, вместо этого вы можете использовать метод diffInDays () Carbon (чтобы узнать, сколько дней в периоде) и разделить результат на 7, затем вы можете привести его к типу int

* 1002. * обновление: это, как сказал Мохаммад Хоссейни, поэтому, чтобы избежать изменения исходного значения, вы можете использовать CarbonImmutable в вашем классе, например:
use Carbon\CarbonImmutable;

вместо использования:

use Carbon\Carbon;

и вам не нужно ничего менять в вашем коде

...