检测Carbon :: createFromDate的日期格式

问题描述

我有一个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会妥善处理。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...