问题描述
我有一个API调用,以各种格式返回日期。我编写了一个try ... catch块来尝试Carbon :: parse和Carbon :: createFromDate,它具有多种格式,这些格式似乎可以正常工作,但是我觉得必须有更好的方法来解决这个问题。
以下是两种可能的日期格式:
2020-09-24T00:00.000Z
24/09/20 00:00:00
这是我的代码
// Test different date formats
$formats = ['d/m/y H:i:s','Y-m-d'];
$dateObj = null;
foreach ($formats as $format) {
try {
if ($dateObj = Carbon::createFromFormat($format,$date)) {
break;
}
} catch (\invalidargumentexception $e) {
$error = 'invalid date';
}
try {
if ($dateObj = Carbon::parse($date)) {
break;
}
} catch (\invalidargumentexception $e) {
$error = 'invalid date';
}
}
解决方法
Carbon::parse()
完全可以解析各种格式(它使用DateTime
本机构造函数),您可以依靠它来了解更常见的格式。实际上,只有在您有确切的期望时,才需要使用createFromFormat()
,或者在有歧义的情况下优先使用1/2
。例如,createFromFormat()
默认以美国方式(1月2日)进行解析,直到2月1日为止,此处首先尝试使用d/m
格式的parse()
格式,否则尝试{{1 }}可能就足够了。在您的示例中,确实需要指定d/m/y H:i:s
,否则顺序将不正确(并且您可以使用*
代替空格,因此T
也可以使用),但是{{1} }是没有用的,Y-m-d
会妥善处理。