我的 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] ) ;
我该如何解决。
谢谢。
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
进行演示