导入手写 CSV 时在 PHP 中检查日期

问题描述 投票:0回答:1

我的 CSV 导入到 Oracle 时容易出错(手动输入)。

我想检查其中的字段是否是有效的(日/月/年)日期。

我写了以下代码

function check_date($a1,$a2,$a3,$a4)
{
    global $error;
    if ( DateTime::createFromFormat('d/m/Y', $a1)->format('d/m/Y') !== $a1 )
    {
        echo "ERROR - Row ($a2) - Column ($a4) - Invalid $a3</br>";
        $error = 1 ;
    }
}

如果该字段为空,则会失败,所以我添加了

function check_date($a1,$a2,$a3,$a4)
{
    global $error;
    if ( $a1 == "" )
    {
        echo "ERROR - Row ($a2) - Column ($a4) - Empty $a3</br>";
        $error = 1 ;
        goto end_function ;
    }
    if ( DateTime::createFromFormat('d/m/Y', $a1)->format('d/m/Y') !== $a1 )
    {
        echo "ERROR - Row ($a2) - Column ($a4) - Invalid $a3</br>";
        $error = 1 ;
    }
    end_function:
}

现在的问题是,如果该字段是任何像“a”这样的字符,脚本就会失败。

我调用该函数

check_date($CSVData[2], $row_count, "ISSUE_DATE" , $alphabet[2] ) ;

我该如何解决。

谢谢。

php function csv date import
1个回答
0
投票

在尝试使用它之前,您只需要检查

DateTime::createFromFormat
的结果是否是
DateTime
对象。由于现在(从 PHP8.0.21、8.1.8 和 8.2.0 开始)此函数可能会抛出错误,因此可以使用 try/catch 块来实现,如果转换失败或不匹配,则抛出异常输入:

function check_date($a1,$a2,$a3,$a4)
{
    global $error;
    try {
        $date = DateTime::createFromFormat('d/m/Y', $a1);
        if ($date === false || $date->format('d/m/Y') !== $a1) throw new Exception('Invalid date');
    }
    catch (Throwable $e) {
        echo "ERROR - Row ($a2) - Column ($a4) - {$e->getMessage()} $a3: \"$a1\"</br>" . PHP_EOL;
        $error = 1 ;
    }
}

check_date("\0", 1, "ISSUE_DATE", 'Start date');
check_date('20/01/2023', 2, "ISSUE_DATE", 'Start date');
check_date('3/4/2023', 3, "ISSUE_DATE", 'Start date');
check_date('2023-01-20', 4, "ISSUE_DATE", 'Start date');
check_date('', 5, "ISSUE_DATE", 'Start date');
check_date('a', 6, "ISSUE_DATE", 'Start date');

输出:

ERROR - Row (1) - Column (Start date) - DateTime::createFromFormat(): Argument #2 ($datetime) must not contain any null bytes ISSUE_DATE: ""</br>
ERROR - Row (3) - Column (Start date) - Invalid date ISSUE_DATE: "3/4/2023"</br>
ERROR - Row (4) - Column (Start date) - Invalid date ISSUE_DATE: "2023-01-20"</br>
ERROR - Row (5) - Column (Start date) - Invalid date ISSUE_DATE: ""</br>
ERROR - Row (6) - Column (Start date) - Invalid date ISSUE_DATE: "a"</br>

3v4l.org

进行演示
© www.soinside.com 2019 - 2024. All rights reserved.