【问题标题】:Excel Date value retrieved as DD/MM/YY,how to format it to YYYY-MM-DD?Excel 日期值检索为 DD/MM/YY,如何将其格式化为 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);             
           }

}

有什么建议吗?

【问题讨论】:

    标签: mysql excel codeigniter csv


    【解决方案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处理解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-25
      • 2012-03-05
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      • 2017-09-30
      • 2021-07-20
      • 2013-10-25
      相关资源
      最近更新 更多