php格式日期1970年以前,从MySQL插入

php格式日期1970年以前,从MySQL插入,php,datetime,fgetcsv,Php,Datetime,Fgetcsv,我正在从CSV文件导入数据,其中一列有日期列表。其中一些日期在1970年之前。例如,日期为1956年3月10日 我在将这些日期格式化为可以插入MySQL的格式时遇到了一个问题 如果我用这个 $date = DateTime::createFromFormat('d/m/Y', $col[8]); 我收到了这个错误消息 对非对象调用成员函数format() 但如果我硬编码这样的日期,它会起作用 $date = DateTime::createFromFormat('d/m/Y', '21/03/

我正在从CSV文件导入数据,其中一列有日期列表。其中一些日期在1970年之前。例如,日期为1956年3月10日

我在将这些日期格式化为可以插入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);
}
$inputFileName='data.csv';
if($handle=fopen($inputFileName,“r”)!==FALSE){
fgetcsv($handle);
while(($data=fgetcsv($handle,1000,“,”)!==FALSE){
$num=计数($data);
对于($i=0;$i<$num;$i++){
$col[$i]=$data[$i];
}
试一试{
$date=DateTime::createFromFormat('d/m/Y',trim($col[8]);
} 
捕获(例外$e){
echo$e->getMessage();
出口(1);
}
echo$日期->格式(“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);
}
define('DATE\u COLUMN',8);
//@警告:避免硬编码文件名!
$inputFileName='data.csv';
if($handle=fopen($inputFileName,“r”)!==FALSE){
fgetcsv($handle);
while(($data=fgetcsv($handle,1000,“,”)!==FALSE){
$num=计数($data);
对于($i=0;$i<$num;$i++){
$col[$i]=$data[$i];
}
$dateString=NULL;
if(isset($col[日期列])和
strlen(修剪($col[日期列])>0){
$dateString=trim($col[DATE_COLUMN]);
}
if(为null($dateString)){
//如果需要,打印日志或引发异常
}
否则{
试一试{
$date=DateTime::createFromFormat('d/m/Y',日期字符串);
echo$日期->格式(“Y-m-d”);
} 
捕获(例外$e){
echo$e->getMessage();
出口(1);
}
}
}
fclose($handle);
}

检查您的CSV,并确保
$col[8]
的所有内容都是有效日期(我认为必须在1901年之后)。字符串可能重复。您确定字符串的日期格式正确吗?例如,如果打印$col[8]并将其与$col[7]进行比较。考虑到格式,它们是否相等?你确定
$col[8]
总是存在吗?@apokryfos我认为任何非负数都可以。