PhpSpreadsheet导入Excel时空日期显示01/01/1970的技术问询
解决Excel空日期导入后显示为01/01/1970的问题
这个问题的核心原因很明确:当你用strtotime()处理空值时,它会返回false,而date()函数会把false解析为时间戳0——也就是Unix纪元的起始时间1970-01-01,最终导致空日期被错误地存入了这个默认值。
下面是具体的修复方案:
1. 修改Excel导入的日期处理逻辑
在导入代码中,需要先判断Excel中的日期字段是否为空,为空时直接存入null(而不是强行格式化)。修改后的导入代码如下:
if($sheetcount>1) { $data=array(); for ($i=1; $i < $sheetcount; $i++) { $lastname=$sheetdata[$i][1]; $firstname=$sheetdata[$i][2]; $middlename=$sheetdata[$i][3]; $zone=$sheetdata[$i][4]; // 修复:先判断日期是否为空,空则存null $bday = !empty($sheetdata[$i][5]) ? date('Y-m-d', strtotime($sheetdata[$i][5])) : null; $age=$sheetdata[$i][6]; $servicegive=$sheetdata[$i][7]; $lmp = !empty($sheetdata[$i][8]) ? date('Y-m-d', strtotime($sheetdata[$i][8])) : null; $edc = !empty($sheetdata[$i][9]) ? date('Y-m-d', strtotime($sheetdata[$i][9])) : null; $gpa=$sheetdata[$i][10]; $remarks=$sheetdata[$i][11]; $teenagepregnancy=$sheetdata[$i][12]; $data[]=array( 'lastname'=>$lastname, 'firstname'=>$firstname, 'middlename'=>$middlename, 'zone'=>$zone, 'bday'=>$bday, 'age'=>$age, 'servicegive'=>$servicegive, 'lmp'=>$lmp, 'edc'=>$edc, 'gpa'=>$gpa, 'remarks'=>$remarks, 'teenagepregnancy'=>$teenagepregnancy, ); } $inserdata=$this->m->insert_batch_teen($data); if($inserdata) { $this->session->set_flashdata('message','<div class="alert alert-success">Successfully Added.</div>'); redirect('dashboard/importteen'); } else { $this->session->set_flashdata('message','<div class="alert alert-danger">Data Not uploaded. Please Try Again.</div>'); redirect('dashboard/importteen'); } }
2. 确保数据库字段允许空值
这一步很关键,如果你的数据库中bday、lmp、edc字段设置为NOT NULL,那么即使你传入null,数据库也会自动将其转为默认日期(比如0000-00-00或1970-01-01)。
你需要修改这些字段的结构:
- 字段类型保持
DATE - 将“允许空值”的选项打开(即设置为
NULL而非NOT NULL)
3. 验证前端展示逻辑
你的前端展示代码已经做了正确的非空判断:
<?php echo !empty($record->bday) ? date('m/d/Y', strtotime($record->bday)) : '';?>
只要数据库中存的是null,!empty($record->bday)就会返回false,最终前端会显示空字符串,完全符合你的需求。
完成以上三步后,Excel中的空日期字段导入后就会在数据表中显示为空值了。
内容的提问来源于stack exchange,提问作者RAMSATECH
相关产品推荐
相关产品推荐

