碳日期比较和日期格式
Carbon dates comparison and date format
我正在尝试以下操作:
我正在开发一个函数来比较以下格式的两个日期:
$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”是一个将字符串日期转换为 Carbon 类型的函数,如下所示:
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);
}
它 returns 像这样的对象:
Carbon\Carbon @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;
returns 我是假的而不是真的?
我一直在关注 Carbon 文档,根据它 $newVariationFormat 必须小于 $oldVariationFormat。
我也测试过使用 lessThan,$first->lessThan($second),但是一样。
我做错了什么?
非常感谢!!
[EXTRAHELP]:我终于需要将我们的日期转换为以下格式:
'2020-08-13T16:09:22.421Z'
这是什么格式?
谢谢。
最近的日期大于更早的日期。所以你要改变比较的方向。
为什么不直接比较 Carbon 对象而不是将它们转换为字符串?
试试这个
if ($newVariationFormat->greaterThan($oldVariationFormat))
前面的代码通常应该 return true;
Carbon 对象也可以与标准运算符进行比较:
if ($newVariationFormat > $oldVariationFormat)
你重新格式化日期可以缩短:
private function reformatDate($date) {
return Carbon::parse(preg_replace('/\s+\(.*\)$/', '', $date));
}
我正在尝试以下操作:
我正在开发一个函数来比较以下格式的两个日期:
$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”是一个将字符串日期转换为 Carbon 类型的函数,如下所示:
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);
}
它 returns 像这样的对象:
Carbon\Carbon @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;
returns 我是假的而不是真的?
我一直在关注 Carbon 文档,根据它 $newVariationFormat 必须小于 $oldVariationFormat。
我也测试过使用 lessThan,$first->lessThan($second),但是一样。
我做错了什么?
非常感谢!!
[EXTRAHELP]:我终于需要将我们的日期转换为以下格式:
'2020-08-13T16:09:22.421Z'
这是什么格式?
谢谢。
最近的日期大于更早的日期。所以你要改变比较的方向。
为什么不直接比较 Carbon 对象而不是将它们转换为字符串? 试试这个
if ($newVariationFormat->greaterThan($oldVariationFormat))
前面的代码通常应该 return true;
Carbon 对象也可以与标准运算符进行比较:
if ($newVariationFormat > $oldVariationFormat)
你重新格式化日期可以缩短:
private function reformatDate($date) {
return Carbon::parse(preg_replace('/\s+\(.*\)$/', '', $date));
}