php - 无法在 php mysql 表中存储 Excel 文件中存在的日期值

标签 php mysql excel date

嗨, friend 们,我有一个 php 程序,用户可以上传 excel 文件,数据将存储在 php 数据库中,它按我的预期工作,但问题是存储在数据库中的日期与我在 excel 中输入的数据完全不同

我使用以下代码从 Excel 中读取值..

include("excel/reader.php");
$data = new Spreadsheet_Excel_Reader();
$data->setOutputEncoding('CP1251');
$data->read($_POST['upload']);

$conn = mysql_connect("localhost","root","");
mysql_select_db("mydatabase",$conn);
$a="TRUNCATE TABLE `sheet`";
mysql_query($a);
for ($x = 2; $x <= count($data->sheets[0]["cells"]); $x++) 
{
$inv = $data->sheets[0]["cells"][$x][1];
$ds = $data->sheets[0]["cells"][$x][2];
$dosstr=strtotime($ds);
$dos=date('Y-m-d',$dosstr);
$ptname = $data->sheets[0]["cells"][$x][3];
$bal = $data->sheets[0]["cells"][$x][4];
$proname = $data->sheets[0]["cells"][$x][5];
$sql = "INSERT INTO sheet (INV,DOS,PTNAME,BAL,PROV)
VALUES ('$inv','$dos','$ptname','$bal','$proname')";
mysql_query($sql);
}
header('location:exsheet2.php');
   ?>

我在 Excel 中存储了以下日期 2014 年 9 月 1 日, 2013年12月28日 , 1991 年 9 月 27 日, 2015 年 1 月 1 日, 2014 年 12 月 31 日 , 2012 年 1 月 1 日 , 2001 年 5 月 9 日。

但是数据库中存储的是 1970年1月1日 , 1970年1月1日 , 1970年1月1日 , 1970年1月1日 , 1970年1月1日 , 1970年1月1日 , 1970年1月1日 , 1970年1月1日。

请帮助我解决这个问题,谢谢

for ($x = 2; $x <= count($data->sheets[0]["cells"]); $x++) 
{
$inv = $data->sheets[0]["cells"][$x][1];
$ds = $data->sheets[0]["cells"][$x][2];
echo $ds;
echo "<br>";
if(ctype_digit($ds))
{
date_default_timezone_set("Asia/Kolkata");
$dDate = date_create('1900-01-01');
$dDate = date_modify($dDate, '+'.($ds-2).' day');
if($dDate!="")
{
$dos = date_format($dDate,'Y-m-d');
echo "IF".$dos;
echo "<br>";
}
else
{ 
$dos=$ds; //not able to convert date so show it directly
echo "Else".$dos;
echo "<br>";
}
}
else 
{
$dos=$ds;
echo"if Else".$dos;
}

$ptname = $data->sheets[0]["cells"][$x][3];
$bal = $data->sheets[0]["cells"][$x][4];
$proname = $data->sheets[0]["cells"][$x][5];
$sql = "INSERT INTO sheet (INV,DOS,PTNAME,BAL,PROV)
VALUES ('$inv','$dos','$ptname','$bal','$proname')";
mysql_query($sql);
}

最佳答案

发现实际问题出在您的日期函数中。您不能使用这些 php 函数,因为它们用于 unix 时间戳。 excel 将日期返回为整数值。 自 1900 年 1 月 1 日以来的天数,包括第一天和最后一天

所以替换这些行:

$dosstr=strtotime($ds);
$dos=date('Y-m-d',$ds);

date_default_timezone_set("Asia/Kolkata");
$dDate = date_create_from_format('Y-m-d', '1900-01-01');
$dDate=date_add($dDate, date_interval_create_from_date_string(($ds-2).' days'));
$dos=$dDate->format('Y-m-d');

PHP 5.2 版本:

date_default_timezone_set("Asia/Kolkata");
$dDate = date_create('1900-01-01');
if($dDate = date_modify($dDate, '+'.($ds-2).' day'))
    $dos = date_format($dDate,'Y-m-d');
else $dos=$ds; //not able to convert date so show it directly

或安全代码:

if(ctype_digit($ds)){
   date_default_timezone_set("Asia/Kolkata");
   $dDate = date_create('1900-01-01');
   $dDate = date_modify($dDate, '+'.($ds-2).' day');
   if($dDate!="") //if($dDate) //is_a($dDate,'DateTime')) //get_class($dDate)=='DateTime' //if ($dDate instanceof DateTime) 
       $dos = date_format($dDate,'Y-m-d');
   else $dos=$ds;
}
else $dos=$ds;
<小时/>

获取日期大于 12 的错误日期的问题原因是:您将日期存储在 Excel 中作为印度日期。但您的笔记本电脑的默认日期和时间是美国或英国...

您需要先更改它(在区域和语言设置中)。

1) 单击窗口中任务栏右侧显示的时间。

2) 在日历下,您将看到一个链接“更改日期和时间设置”。打开它。

3) 点击“更改日期和时间”按钮 -> 然后点击更改日历设置链接。

4) 可能还会打开两个窗口。关闭自定义格式窗口并转到“区域和语言”。

5) 选择“English(India)”作为格式,选择“dd-MM-yyyy”作为短日期。

6) 单击“确定”。然后再尝试,如果有问题,评论。

关于php - 无法在 php mysql 表中存储 Excel 文件中存在的日期值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27720292/

相关文章:

javascript - 如何每秒更新 Php 变量?来自 mySql 的变量

php - 无法连接到 "localhost"端口 25 的邮件服务器,验证 php.ini 中的 "SMTP"和 "smtp_port"设置或使用 ini_set()

javascript - 浏览器自动下载PHP文件

mysql - 之前预期的聚合函数(在带有子查询的 SELECT 中

vba - Excel VBA - alt keydown 事件在用户窗体上每隔一段时间触发一次

Excel 组合框 listfillrange 属性指向基于公式的命名范围有问题

Excel VBA - 自动输入密码

PHP:从对象内部销毁对象?

php - 在 codeigniter 中更新多个 id

php - 如何使用 CodeIgniter 在 MySQL 中插入 HTML 实体?