我见过很多的引用来转换Excel的序列日期格式“日期”部分,但每个人似乎都忽略了它的“时间”部分。
以下是我需要做的:
我有我导入Excel文件。 PHP使用。
我遇到了Excel日期序列格式(dddddd.tttttt),需要将其转换为一个完整的Unix时间戳。
我已经尝试了一些不同的东西,但我越来越挂在如何做到这一点的流体运动。
我见过很多的引用来转换Excel的序列日期格式“日期”部分,但每个人似乎都忽略了它的“时间”部分。
以下是我需要做的:
我有我导入Excel文件。 PHP使用。
我遇到了Excel日期序列格式(dddddd.tttttt),需要将其转换为一个完整的Unix时间戳。
我已经尝试了一些不同的东西,但我越来越挂在如何做到这一点的流体运动。
请使用这个公式从Excel日期的Unix日期更改,那么你可以使用“gmdate”要获得在PHP真正的日期:
UNIX_DATE = (EXCEL_DATE - 25569) * 86400
并从Unix日期到Excel转换日期,使用这个公式:
EXCEL_DATE = 25569 + (UNIX_DATE / 86400)
这样的公式的变量后,您可以使用这个例子中得到了真正的日期在PHP中:
$UNIX_DATE = ($EXCEL_DATE - 25569) * 86400;
echo gmdate("d-m-Y H:i:s", $UNIX_DATE);
谢谢。
这oneliner工作对我来说,当然是使用PHPExcel。
$date_formated = date('Y-m-d', PHPExcel_Shared_Date::ExcelToPHP($date_int_val));
很显然你还没看很辛苦:
直接从PHPExcel日期处理代码摘自:
public static function ExcelToPHP($dateValue = 0) {
if (self::$ExcelBaseDate == self::CALENDAR_WINDOWS_1900) {
$myExcelBaseDate = 25569;
// Adjust for the spurious 29-Feb-1900 (Day 60)
if ($dateValue < 60) {
--$myExcelBaseDate;
}
} else {
$myExcelBaseDate = 24107;
}
// Perform conversion
if ($dateValue >= 1) {
$utcDays = $dateValue - $myExcelBaseDate;
$returnValue = round($utcDays * 86400);
if (($returnValue <= PHP_INT_MAX) && ($returnValue >= -PHP_INT_MAX)) {
$returnValue = (integer) $returnValue;
}
} else {
$hours = round($dateValue * 24);
$mins = round($dateValue * 1440) - round($hours * 60);
$secs = round($dateValue * 86400) - round($hours * 3600) - round($mins * 60);
$returnValue = (integer) gmmktime($hours, $mins, $secs);
}
// Return
return $returnValue;
} // function ExcelToPHP()
设置自:: $ ExcelBaseDate ==作为必要的自我:: CALENDAR_WINDOWS_1900以表明您使用的是Excel的基本日历:1900的Windows或Mac 1904
如果你想有一个PHP DateTime对象,而不是:
public static function ExcelToPHPObject($dateValue = 0) {
$dateTime = self::ExcelToPHP($dateValue);
$days = floor($dateTime / 86400);
$time = round((($dateTime / 86400) - $days) * 86400);
$hours = round($time / 3600);
$minutes = round($time / 60) - ($hours * 60);
$seconds = round($time) - ($hours * 3600) - ($minutes * 60);
$dateObj = date_create('1-Jan-1970+'.$days.' days');
$dateObj->setTime($hours,$minutes,$seconds);
return $dateObj;
} // function ExcelToPHPObject()
我曾在一个项目同样的问题,我一直在寻找一个PHP Class to Read Excel as PHP Array
。 我很幸运,我找到了'SimpleXLSX' Class
。 它可以处理Excel数据非常好,但是..但是...喔! 但是.... :(我已经意识到,有一些问题与Date Reading From Excel
领域。在Excel中值看起来很不错,但是当我们试图将其导入,该日期值让不同。有的时候我们得到正确的值有时只是一个数字和一些次浮点值。我们正在寻找解决方案“
为什么它正在发生,为什么PHP没有得到正确的日期从Excel
“那么说,很多goggling后,我们找到了原因:
@Source: 读XLS日期在PHP
根据Excel格式41397是2013年5月3日Excel存储日期和时间,作为表示自1900年以来-JAN-0的天数的数,加一天24小时的小数部分:ddddd.tttttt。 这就是所谓的序列日期,或串行日期 - 时间。
@Source: 使用PHP Excel的Excel的日期转换
转换Excel日期为Unix日期,然后转换Unix日期到PHP日期
所以,我做了一个小帮手类阅读在PHP中使用Excel的日期。 我希望这会帮助别人的同时会降低goggling和努力。
这里是我的代码来Read Excel as PHP Array()
和Parse Excel Date as PHP Date
对于初学者:
SimpleXLSX.php
从给出的示例代码 这里是PHP代码:
<?php
/*
EXCEL DATA EXAMPLE:
----------------------------
ID Consumer_Date Delivery_Date Date_of_Dispatch Gift_Date_Created Active_Date Approved_Date
536 -No-Data- 9-Nov-15 7-Nov-15 -No-Data- 10/31/2015 12:00:00 AM 4/11/2015 10:21
537 -No-Data- -No-Data- 7-Nov-15 -No-Data- 10/23/2015 12:00:00 AM 3/11/2015 16:24
*/
/*
EXCEL DATA IN PHP ARRAY FORMAT
-------------------------------
Array
(
[0] => Array
(
[ID] => 536
[Consumer_Date] => -No-Data-
[Delivery_Date] => 42317
[Date_of_Dispatch] => 42315
[Gift_Date_Created] => -No-Data-
[Active_Date] => 10/31/2015 12:00:00 AM
[Approved_Date] => 42105.431574074
)
[1] => Array
(
[ID] => 537
[Consumer_Date] => -No-Data-
[Delivery_Date] => -No-Data-
[Date_of_Dispatch] => 42315
[Gift_Date_Created] => -No-Data-
[Active_Date] => 10/23/2015 12:00:00 AM
[Approved_Date] => 42074.683958333
)
)
*/
/* ----------------- */
/* Excel_Date_Parser.php */
/* ----------------- */
// Numbers of days between January 1, 1900 and 1970 (including 19 leap years)
define("MIN_DATES_DIFF", 25569);
// Numbers of second in a day:
define("SEC_IN_DAY", 86400);
/** Set default timezone (will throw a notice otherwise) */
date_default_timezone_set('Asia/Kolkata');
/**
* Class Excel_Date_Parser
*
* SetDateString($excel_date_value) : send excel date column value
* GetDateString(): get your php date in Y-m-d format (MySQL)
*/
class Excel_Date_Parser
{
/**
* Send Excel Date String Value Here
* @param [type] $date_from_excel [description]
* @return instance Excel_Date_Parser
*/
public function SetDateString($date_from_excel) {
$this->date_from_excel = $date_from_excel;
return $this;
}
/**
* Set Date Format Here, default is "Y-m-d"
* @param string $set_format_date [description]
*/
public function SetDateFormat($set_format_date = "Y-m-d") {
$this->set_format_date = $set_format_date;
}
/**
* Get what format is set
*/
public function GetDateFormat() {
return $this->set_format_date;
}
/**
* Return PHP date according to Set Format from Excel Date
* @return string php date
*/
public function GetDateString() {
// if value is valid date string
if (strtotime($this->date_from_excel)) {
/**
* Excel stores dates and times as a number representing the number of days since 1900-Jan-0,
* plus a fractional portion of a 24 hour day: ddddd.tttttt.
* This is called a serial date, or serial date-time.
*
* @source: https://stackoverflow.com/questions/17808750/reading-xls-date-in-php
*/
if (is_float($this->date_from_excel)) {
// date format 2015-25-12
$this->SetDateFormat("Y-d-m");
$this->date_from_excel = date($this->GetDateFormat() , (mktime(0, 0, -1, 1, $this->date_from_excel, 1900)));
}
else {
// date format 2015-12-25
$this->SetDateFormat();
// return converted date string in php format date format 2015-12-25
$this->date_from_excel = date($this->GetDateFormat() , strtotime($this->date_from_excel));
}
}
/**
* Excel stores dates and times as a number representing the number of days since 1900-Jan-0,
* plus a fractional portion of a 24 hour day: ddddd.tttttt .
* This is called a serial date, or serial date-time.
*
* According to excel format 41397 is 2013-05-03
* @source: https://stackoverflow.com/questions/17808750/reading-xls-date-in-php
*/
else if (is_integer($this->date_from_excel)) {
$this->SetDateFormat();
$this->date_from_excel = gmdate($this->GetDateFormat() , (($this->date_from_excel - MIN_DATES_DIFF) * SEC_IN_DAY));
}
// return real value
else {
$this->date_from_excel = $this->date_from_excel;
}
// return date
return $this->date_from_excel;
}
}
/* ----------------- */
/* Excel_Reader.php */
/* ----------------- */
/* Show errors */
error_reporting(1);
/* display error */
ini_set('display_errors', 1);
/**
* Using class SimpleXLSX
*
* Big Thanks!!!! to Sergey Shuchkin, Who made Excel Reader Class
*
* This class can be used to parse and retrieve data from Excel XLS spreadsheet files.
* It can parse a given Excel XLS file by extracting its contents files and parsing the
* contained XML spreadsheet file.
*
* The class provides functions to retrieve data for the spreadsheet worksheets, rows and cells.
*
* @link: http://www.phpclasses.org/package/6279-PHP-Parse-and-retrieve-data-from-Excel-XLS-files.html
* @author: Sergey Shuchkin
* @download: http://www.phpclasses.org/browse/download/zip/package/6279/name/simple-xlsx-2013-10-13.zip
*/
require_once 'SimpleXLSX.php';
/* Adding my class Excel_Date_Parser */
require_once 'Excel_Date_Parser.php';
/**
* [toPhpDate description]
* @param [type] $array [description]
*/
function toPhpDate($array) {
// create class object
$ed = new Excel_Date_Parser();
// parse array and set
$array['Consumer_Date'] = $ed->SetDateString($array['Consumer_Date'])->GetDateString();
$array['Delivery_Date'] = $ed->SetDateString($array['Delivery_Date'])->GetDateString();
$array['Date_of_Dispatch'] = $ed->SetDateString($array['Date_of_Dispatch'])->GetDateString();
$array['Gift_Date_Created'] = $ed->SetDateString($array['Gift_Date_Created'])->GetDateString();
$array['Active_Date'] = $ed->SetDateString($array['Active_Date'])->GetDateString();
$array['Approved_Date'] = $ed->SetDateString($array['Approved_Date'])->GetDateString();
// return php array
return $array;
}
// make xls object
$xlsx = new SimpleXLSX('Sony_RedemptionFormat 8-Dec-15.xlsx');
// get excel data as array
$Excel_Array_Data = $xlsx->rows();
// Get Column Name
$Excel_Column = $Excel_Array_Data[0];
// Remove Column Name From Array
unset($Excel_Array_Data[0]);
// Rest Data is Excel Data without Column
$Excel_Data = $Excel_Array_Data;
// Combine array for inserting in database
foreach ($Excel_Array_Data as $key => $Excel_Data) {
$insert_data[] = array_combine($Excel_Column, $Excel_Data);
}
// show array data
echo "<pre>", print_r($insert_data, true);
// update array excel date
$insert_data = array_map('toPhpDate', $insert_data);
// show array data after update date
echo "<pre>", print_r($insert_data, true);
希望这个代码将会帮助别人。 所以我做了这个小脚本救别人时我挣扎同样的问题。
快乐PHPING !!!! :)