Сравнение углеродных дат и формат даты

#php #laravel #date #php-carbon

#php #laravel #Дата #php-carbon

Вопрос:

Я пытаюсь сделать следующее:

Я разрабатываю функцию для сравнения двух дат в следующем формате:

 $date = "Mon Sep 14 2020 02:07:25 GMT 0000 (Coordinated Universal Time)";
  

Функция следующая (в ней есть дополнительный код для моих тестов):

 private function isMoreRecent($newVariation, $oldVariation) {
    // dates for testing:
    $newVariation = "Mon Sep 14 2020 02:07:25 GMT 0000 (Coordinated Universal Time)";
    $oldVariation = "Sun Sep 13 2020 12:02:49 GMT 0000 (Coordinated Universal Time)";
    // dates for testing:

    // date: 2020-09-14 02:07:25.0 UTC ( 00:00)
    $newVariationFormat = $this->reformatDate($newVariation);
   

    // date: 2020-09-13 12:02:49.0 UTC ( 00:00)
    $oldVariationFormat = $this->reformatDate($oldVariation);
    
    if ($newVariationFormat->toDateString() < $oldVariationFormat->toDateString()) {
        dd('holaaa');
        return true;
    }
    return false;
}
  

«reformatDate» — это функция для преобразования нашей строковой даты в углеродный тип следующим образом:

 private function reformatDate($date) {
    $month = substr($date, 4, 3);
    $month = intval($this->getMonthNumber($month));
    $day = intval(substr($date, 8, 2));
    $year = intval(substr($date, 11, 4));
    $hour = substr($date, 16, 2);
    $minutes = substr($date, 19, 2);
    $seconds = substr($date, 22, 2);

    return Carbon::create($year, $month, $day, $hour, $minutes, $seconds);
}
  

Где getMonthNumber():

 private function getMonthNumber($month) {
    $monthKeyValues = [
        '1' => 'Jan',
        '2' => 'Feb',
        '3' => 'Mar',
        '4' => 'Apr',
        '5' => 'May',
        '6' => 'Jun',
        '7' => 'Jul',
        '8' => 'Ago',
        '9' => 'Sep',
        '10' => 'Oct',
        '11' => 'Nov',
        '12' => 'Dec',
    ];

    return array_search($month, $monthKeyValues);
}
  

он возвращает объект, подобный этому:

 CarbonCarbon @1600049245 {#255 ▼
#constructedObjectId: "0000000021e9258b000000005e04548d"
#localMonthsOverflow: null
#localYearsOverflow: null
#localStrictModeEnabled: null
#localHumanDiffOptions: null
#localToStringFormat: null
#localSerializer: null
#localMacros: null
#localGenericMacros: null
#localFormatFunction: null
#localTranslator: null
#dumpProperties: array:3 [▶]
#dumpLocale: null
date: 2020-09-14 02:07:25.0 UTC ( 00:00)
}
  

Ну, у меня следующий вопрос: для двух дат, которые я использую для тестирования,

 $newVariation = "Mon Sep 14 2020 02:07:25 GMT 0000 (Coordinated Universal Time)";
$oldVariation = "Sun Sep 13 2020 12:02:49 GMT 0000 (Coordinated Universal Time)";
  

$newVariation раньше, чем $oldVariation, так почему:

 if ($newVariationFormat->toDateString() < $oldVariationFormat->toDateString()) {
        dd('holaaa');
        return true;
    }
    return false;
  

возвращает мне false вместо true?

Я следил за документацией Carbon, и в соответствии с ней $ newVariationFormat должен быть меньше, чем $ oldVariationFormat.

Я также тестировал с использованием LessThan, $first-> LessThan ($ second), но то же самое.

Что я делаю не так?

Большое спасибо!!

[ДОПОЛНИТЕЛЬНАЯ ПОМОЩЬ]: Мне, наконец, нужно преобразовать наши даты в следующий формат:

 '2020-08-13T16:09:22.421Z'
  

Что это за формат?

Спасибо.

Комментарии:

1. Я бы действительно начал с createFromFormat , а не с вашей простой reformatDate функции.

2. Вы говорите «$ newVariation раньше, чем $ oldVariation», но в вашем примере это не так; $ newVariation примерно на 14 часов позже , чем $ oldVariation.

3. спасибо за замечание, я собираюсь его переписать

4. Cbroe, как бы вы использовали Carbon «createFromFormat» вместо использования моей функции переформатирования?

Ответ №1:

Недавняя дата больше, чем более ранняя дата. Поэтому вам нужно изменить направление вашего сравнения.

Почему бы напрямую не сравнить углеродные объекты вместо преобразования их в строки? Попробуйте это

 if ($newVariationFormat->greaterThan($oldVariationFormat)) 
  

Предыдущий код обычно должен возвращать true;

Комментарии:

1. спасибо за ответ, теперь я вижу, что ошибся, объясняя себя, но очень ценю ваш вклад «Недавняя дата больше, чем более ранняя» (слишком много часов перед компьютером)

Ответ №2:

Объект Carbon также можно сравнить со стандартными операторами:

 if ($newVariationFormat > $oldVariationFormat)
  

И вы переформатируете дату, которую можно сократить:

 private function reformatDate($date) {
    return Carbon::parse(preg_replace('/s (.*)$/', '', $date));
}