MySQL格式日期1970年前来自MySQL插入

时间:2016-04-01 13:54:24

标签: php datetime fgetcsv

我从CSV文件导入数据,一列有日期列表。其中一些日期是1970年以前。示例日期是10/03/1956

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

如果我使用这个

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

我收到此错误消息

  

在非对象

上调用成员函数format()

但如果我硬编码这样的日期,它就可以了

$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);
}

1 个答案:

答案 0 :(得分:1)

您无法保证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);
}