php 为 MySQL 插入格式化 1970 年之前的日期

php format date pre 1970 fro MySQL insert

我正在从 CSV 文件导入数据,其中一列包含日期列表。其中一些日期是 1970 年之前的日期。示例日期为 10/03/1956

我在将这些日期格式化为可以插入 MySQL 的格式时遇到问题。

如果我用这个

$date = DateTime::createFromFormat('d/m/Y', $col[8]);

我收到此错误消息

Call to a member function format() on a non-object

但是如果我像这样硬编码日期,它就可以工作

$date = DateTime::createFromFormat('d/m/Y', '21/03/1966');

这里是完整的代码

$inputFileName = 'data.csv';

if (($handle = fopen($inputFileName, "r")) !== FALSE) {

    fgetcsv($handle); 

    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {

        $num = count($data);

        for ($i = 0; $i < $num; $i++) {
            $col[$i] = $data[$i];
        }

        try {
            $date = DateTime::createFromFormat('d/m/Y', trim($col[8]));
        } 
        catch (Exception $e) {
            echo $e->getMessage();
            exit(1);
        }

        echo $date->format("Y-m-d");
    }
    fclose($handle);
}

您无法保证所有字段都会存在于您的 CSV 文件中,因此您必须做一些控制

define('DATE_COLUMN', 8);
// @Warning : avoid hard coding file name !
$inputFileName = 'data.csv';

if (($handle = fopen($inputFileName, "r")) !== FALSE) {

    fgetcsv($handle); 

    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {

        $num = count($data);

        for ($i = 0; $i < $num; $i++) {
            $col[$i] = $data[$i];
        }
        $dateString = NULL;
        if (isset($col[DATE_COLUMN]) && 
            strlen(trim($col[DATE_COLUMN])) > 0) {

            $dateString = trim($col[DATE_COLUMN]);
        }

        if (is_null($dateString)) {
            // print log or throw an exception if you want
        }
        else {
           try {
               $date = DateTime::createFromFormat('d/m/Y', dateString);
               echo $date->format("Y-m-d");
           } 
           catch (Exception $e) {
               echo $e->getMessage();
               exit(1);
           }
        }

    }
    fclose($handle);
}