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?的主要内容,如果未能解决你的问题,请参考以下文章
SQL日期格式转换? [dd.mm.yy 到 YYYY-MM-DD]
Pandas - 将日期列从 dd/mm/yy hh:mm:ss 转换为 yyyy-mm-dd hh:mm:ss