2011-04-14 47 views
2

這是在我的電子表格:PHPExcel日期字段不匹配源電子表格

12/04/2011 8:56:17 p.m. (xls dateserial = 40645.87242) 

這是我的代碼,我使用提取的日期,並轉換爲日期字符串在PHP中:

$txn_date_xls = $sheet->getCell("H$row")->getValue();    
echo "Txn Date (original): $txn_date_xls<br />"; 

$txn_date = PHPExcel_Shared_Date::ExcelToPHP($txn_date_xls); 
echo "Txn Date: ".date('Y-m-d H:i:s', $txn_date)."<br />"; 

這是我的腳本輸出:

Txn Date (original): 40644.55783637732 
Txn Date: 2011-04-11 13:23:17 

日期序列沒有原來的電子表格相匹配。 因此,我試圖確定這是PHPExcel的錯誤,還是我錯過了一個設置或其他東西,我需要在從單元中提取dateserial之前執行此操作。可能是一個時區問題?

對不起,我還不是很熟悉PHPExcel庫。

回答

10

我不太確定這一點,但...

功能date()在PHP取決於服務器的時區設置。

PHPExcel_Shared_Date :: ExcelToPHP()假定提供的日期是格林尼治標準時間並相應地返回Unix時間。

所以嘗試(使用date_default_timezone_set()

date_default_timezone_set('UTC'); 

或像這樣(使用ini_set()

ini_set('date.timezone', 'UTC'); 

此外,在腳本的開頭來設置PHP時區GMT/UTC,請嘗試使用gmdate()代替date(),否則您可能會得到1天抵消

可用鏈接:

+0

使用gmdate()確實有所幫助,但並未解決問題。 – bumperbox 2011-04-14 02:13:01

+0

我保存了與xlsx文件相同的文件並將其導入(並使用了gmdate),它工作。所以也許它與文件格式有關? – bumperbox 2011-04-14 02:13:48

+0

@ Wh1T3h4Ck5 - 如果有人告訴我蟲子,那麼我可能會解決它們......大部分我聽到的都是「它不工作」。但是你是對的,PHPExcel將所有的Excel日期序列視爲UTC時間戳。我不知道在.xls BIFF格式中有任何值可以識別時區偏移(只是Windows 1900/Mac 1904日曆切換),而隨後使用date()函數將返回的unix時間戳值到顯示格式將調整爲默認時區。 – 2011-04-14 08:38:54

2

定義

date_default_timezone_set(YOUR_TIME_ZONE); 

改變這一行:

date('Y-m-d H:i:s', $txn_date) 

到:

PHPExcel_Style_NumberFormat::toFormattedString($txn_date_xls, 'Y-m-d H:i:s')