Excel 日期值检索为 DD/MM/YY,如何将其格式化为 YYYY-MM-DD?

Posted

技术标签:

【中文标题】Excel 日期值检索为 DD/MM/YY,如何将其格式化为 YYYY-MM-DD?【英文标题】:Excel Date value retrieved as DD/MM/YY,how to format it to YYYY-MM-DD? 【发布时间】:2016-03-01 05:01:15 【问题描述】:

在转换从 excel 表中检索到的日期时,YEAR 被插入为 20XX 而不是 19xx。

点击excel表格中的单元格,我们可以知道年份并且正确显示,但是在插入时,19xx被插入为20xx。

当我回显从 Excel 表中检索到的日期时-

    echo date('Y-m-d', strtotime($data[3]));
    exit();  //output 1970-01-01

   echo $data[3];
    exit();  //output 22/11/66

我尝试了以下方法-

1. $dob=date('Y-m-d', strtotime(str_replace('/', '.', $data[3])));

输出 - 有些年份正确,但有些 19xx 显示为 20xx

示例-2066-11-22 而不是 1966-11-22

2. $dob = implode('-', array_reverse(explode('/', $data[3])));

输出-YY-MM-DD

3. $dob=date('Y-m-d', strtotime(str_replace('/', '-', trim($data[3]))));

输出 - 1970-01-01

在模型中从excel中检索数据-

function upload()
   ini_set('auto_detect_line_endings',TRUE);
 /* if (is_uploaded_file($_FILES['userfile']['tmp_name'])) 

  readfile($_FILES['userfile']['tmp_name']);
    */
    if (($handle = fopen($_FILES['userfile']['tmp_name'], "r")) !== FALSE) 
    $firstRow = true;
        while (($data = fgetcsv($handle, 4096, ",",'"')) !== FALSE)
        
         $num = count($data);
                if($data[0]!="")
                    //echo implode('-', array_reverse(explode('/', $data[3])));exit();
                    if($data[3]!="")
                    
                        //$dob=date('Y-m-d', strtotime(str_replace('/', '.', $data[3])));
                        //$dob=date("Y-m-d", strtotime($data[3]));
                        //$dob = implode('-', array_reverse(explode('/', $data[3])));
                        //$dob=date("Y-m-d", strtotime($date));
                        $dob=date('Y-m-d', strtotime(str_replace('/', '-', trim($data[3]))));
                    
                     $data1 = array(
                    'member_name' => $data[1],
                     'member_phone' => $data[2],
                     'member_dob' => $dob,
                     'member_outlet' => $data[4]
                   );
                  //echo "<pre/>";print_r($data) ;exit(); 
                       $this->db->insert('member_info', $data1);
                       $member_id = $this->db->insert_id();
                

        

//echo "<pre/>";print_r($data) ;exit();
     fclose($handle); 
    
ini_set('auto_detect_line_endings',FALSE);             
           


有什么建议吗?

【问题讨论】:

【参考方案1】:

我认为以下代码很糟糕 - 我宁愿尝试更改 Excel 电子表格的日期格式 - 但它适用于您提供的示例日期:

$data[3] = '22/11/66'; 
$arr = explode('/', $data[3]);
$dob = date("Y-m-d", strtotime('19' . $arr[2] . '/' . $arr[1] . '/' . $arr[0]));
echo var_dump($dob);

php 处理 1970 年之前两位数年份的方式似乎存在问题。使用来自 PHP documentation 的 dd.mm.yy 格式的示例日期...

$dob = date("Y-m-d", strtotime("30.6.08"));
echo var_dump($dob); // 2008-06-30

$dob = date("Y-m-d", strtotime("30.6.66"));
echo var_dump($dob); // 1970-01-01

$dob = date("Y-m-d", strtotime("30.6.1966"));
echo var_dump($dob); // 1966-06-30

我需要将“19”添加到两位数的年份以获取 strtotime 以了解年份。

【讨论】:

但问题是有些年份是 19xx,有些是 20xx,那怎么办? 您的意思是通过更改日期格式来创建新的 Excel 工作表吗? 如果您的 Excel 工作表具有 DD/MM/YY 格式的日期,例如 31/01/12,我看不出您将如何编写一个函数来区分 31/01/2012 和 31 /01/1912。您可以假设像 00 到 20 这样的两位数年份总是意味着 2000 到 2020 年,而像 21 到 69 这样的年份总是 1921-1969 或类似的年份,但这似乎是一个杂牌。如果可能,我会更改 Excel 工作表日期格式。【参考方案2】:

我遇到了和上面一样的问题,

但是 我没有在 php 端进行处理,而是 将 excel 文件的列数据类型更改为 text 替换 date

现在我在 php 方面所做的一切都是我们经常做的:

<?php
  $date = date("Y-m-d", strtotime($excel_date));
 //here you can insert it in your db table if you want.
?>

但是如果你无法控制将要上传的excel文件,那么请使用上面的php处理解决方案。

【讨论】:

以上是关于Excel 日期值检索为 DD/MM/YY,如何将其格式化为 YYYY-MM-DD?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Django 日期格式更改为 dd/mm/yy?

SQL日期格式转换? [dd.mm.yy 到 YYYY-MM-DD]

Pandas - 将日期列从 dd/mm/yy hh:mm:ss 转换为 yyyy-mm-dd hh:mm:ss

sql日期格式化

在java中将dateTime转换为dd/MM/yy格式的日期

将字符串dd / mm / yy转换为datetime