You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 13:59:09