为啥来自 csv 的日期在 php 端显示为数字?
Posted
技术标签:
【中文标题】为啥来自 csv 的日期在 php 端显示为数字?【英文标题】:Why coming dates from csv display as numbers in php side?为什么来自 csv 的日期在 php 端显示为数字? 【发布时间】:2015-04-08 11:38:57 【问题描述】:好吧,我不知道为什么会这样,但是我在 Excel 中的以下日期字段显示为数字,甚至没有时间戳。
我的 excel csv 文件日期字段的屏幕截图。
现在,当我阅读 CSV 日期字段时,将使用 php 在组合框中将此日期显示为以下数字,我不知道为什么它会这样显示,我应该怎么做才能转换回我的 csv 文件日期。 当我执行 data[$k] 读取 csv 文件时,会显示以下日期: 组合框中的 41724 和 41731 等等。怎么办?
我的代码:
while($data = fgetcsv($handle, 1000, ","))
if($row == 10)
break;
else
if($mycount == 0)
$mycount = 1;
$field_name = $data[$k];
$tot_combo = $tot_combo + 1;
else
**$user_data[]** = $data[$k]; //where date coming here
$row = $row+1;
所以在做了更多研究后,我在 csv excel 文件中发现我的日期列被指定为日期,当在 php 中读取文件时,它将该日期列转换为文本,这将返回我 41708 而不是 10/03/2014 任何想法如何实现这一点谢谢
【问题讨论】:
如果你想得到答案,你应该添加一些相关的代码。 检查 Excel 中的格式(右键单击单元格并选择“设置单元格格式”) - 确保它使用适合您尝试导出的日期格式。 csv 文件的 sn-p 也很有用。请记住 csv 文件中没有日期(它的文本!),有以某种格式表示日期的字符串或数字. 感谢尝试通过格式单元格并在 excel 中选择“日期”,但仍然得到 41724 这样的结果:( 我认为它;当我从 csv 文件中提取数据时以文本形式出现,因为如果我将单元格格式化为 csv 日期列到文本,那么它只会给我 5 个数字,我在我的输出中得到在 php.ini 中。所以我在 excel 或 php 方面做什么,如果我从 csv 接收日期然后显示为日期。 【参考方案1】:因为这个数字是一个 MS Excel 序列化的时间戳,它是 MS Excel 存储日期值的方式,然后使用数字格式掩码将它们呈现为人类可读的日期。
到 PHP DateTime 对象的快速而肮脏的转换:
function ExcelToPHPObject($excelDateTime = 0)
$calendarBaseLine = '1899-12-30';
if ($excelDateTime < 60)
// 29th February will be treated as 28th February
++$excelDateTime;
return (new \DateTime($calendarBaseLine, new \DateTimeZone('UTC')))
->modify('+' . floor($excelDateTime) . ' days')
->modify('+' . floor(fmod($excelDateTime, 1) * 86400) . ' seconds');
此函数将返回一个 PHP DateTime 对象(假设 MS Excel Windows 1900 日历),然后您可以使用 DateTime 对象的 format()
方法来格式化您想要的日期/时间,所以:
$excelDateTime = 41724;
echo ExcelToPHPObject($excelDateTime)->format('Y-m-d H:i:s');
【讨论】:
详细说明错误?你希望@Mark 怎么跟进? 我发布的代码有效 - Demo - 如果您遇到错误,请明确说明您从此代码中遇到的错误以上是关于为啥来自 csv 的日期在 php 端显示为数字?的主要内容,如果未能解决你的问题,请参考以下文章
PHP/MySQL:导入 CSV,所有日期和十进制值都为空,零