#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));
}