【问题标题】:Unable to store Date values in php mysql table that are existing in excel file无法将日期值存储在 excel 文件中存在的 php mysql 表中
【发布时间】:2014-12-31 11:11:36
【问题描述】:

你好朋友我有一个 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 日, 28/12/2013 , 1991 年 9 月 27 日, 2015 年 1 月 1 日, 2014 年 12 月 31 日, 2012 年 1 月 1 日, 2001 年 5 月 9 日。

但是存储在数据库中的是 1970-01-01 , 1970-01-01 , 1970-01-01 , 1970-01-01 , 1970-01-01 , 1970-01-01 , 1970-01-01 , 1970-01-01。

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

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);
}

【问题讨论】:

  • 回声 $ds;粘贴输出
  • 如果我只是打印 $ds 我得到以下输出 41648,41636,33508,42005,42004,40909,37139
  • 所以你在解析 excel 后没有得到日期。不是吗?
  • 是的,你说得对,我什至更改了 excel 中的单元格格式,但没有用
  • @manikandan 这是 PHP 日期函数的问题,Excel 将日期作为整数返回,它不是天数,不是时间戳。请参阅我的答案以获得解释。

标签: php mysql excel date


【解决方案1】:

发现实际问题出在您的日期函数中。您不能使用这些 php 函数,因为这些函数用于 unix 时间戳。并且 excel 将日期返回为 integer 值。 自 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) 单击确定。然后再试一次,如果有问题,请评论。

【讨论】:

  • 我试过了,但它返回了以下错误:tFatal error: Call to undefined function date_create_from_format() in C:\wamp\www\dbpro file\one\exsheet.php on line 20跨度>
  • @manikandan 您正在使用的 php 版本,此功能由 (PHP 5 &gt;= 5.3.0) 支持。如果您的版本较低,则:如果您可以升级,请执行或告诉我,我会找到适合您版本的东西。
  • 哦,我正在使用 PHP 版本 5.2.2
  • 你能帮我解决这个问题吗?我正在进行我的大学项目,没有这个我无法完成我的项目。
  • @manikandan 是的。但问题是我给出了四个 PHP 日期时间函数 date_create_from_format()date_add()date_interval_create_from_date_string()date-&gt;format()。其中前三个由 PHP-5.3 支持 |第一个函数可以替换为$dDate = date_create('1900-01-01');。现在我们需要找到下一行的两个函数的替换。
【解决方案2】:

打印 sql 查询并检查查询中插入了哪些值。日期格式应为“Y-m-d”。

【讨论】:

  • 是的,约翰我试过了,但打印出同样的错误值
【解决方案3】:

只需从 Excel 工作表的日期列中删除所有格式。然后再试一次。这可能会帮助你PHP Spreadsheet_Excel_Reader always reading date as Nov 30, 1999, http://dirtyhandsphp.blogspot.in/2012/03/phpexcelreader-uses-and-problems.html

【讨论】:

  • 我试过如果日期低于 1​​2 它对我有部分工作它显示不正确的日期(例如 25/01/2014 在 excel 中它在浏览器中打印为 2014-01-25 但 1/ 2/2014 在数据库中存储为 2014-01-03,类似地 8/9/2000 存储为 2000-08-10)
猜你喜欢
  • 2015-09-25
  • 1970-01-01
  • 1970-01-01
  • 2010-11-23
  • 2014-10-11
  • 1970-01-01
  • 2012-04-14
  • 2010-11-10
  • 1970-01-01
相关资源
最近更新 更多