我在我的一个项目中使用http://phpexcel.codeplex.com,遇到了一个问题,我想在一个单元格中写入time()值,我正在使用:
function writeTimeLine($objActiveSheet, &$lineNumber, $timeStart, $timeEnd, $duration, $category, $client, $date, $comment)
{
$objActiveSheet->setCellValue('A'.$lineNumber, PHPExcel_Shared_Date::PHPToExcel( $timeStart ));
$objActiveSheet->getStyle('A'.$lineNumber)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME4);
}
$objActiveSheet引用$objPHPExel-〉getActiveSheet()
Excel中的结果为:
20点27分39秒
我在电脑上测试的时候是16:27:39
所以这是一个时区的问题(我住在美国东部,是-4)。然而,我在使用设置默认时区后包括PHPExel文件
date_default_timezone_set('America/New_York');
而且即使有时间的回声()我也确实看到了正确的时间(16:27:39)。
是PHPExel的一个bug还是我在这里做错了什么?
谢谢你的帮助。
4条答案
按热度按时间u1ehiz5o1#
您最好添加时间差,而不是更改PHPExcel库:
例如:
2w2cym1i2#
承认相当老,但想提供另一种解决方案。
如果您不想编辑库源文件,因为
PHPExcel_Shared_Date::PHPToExcel
(1.7.8+)接受整数时间戳或DateTime对象,所以您可以轻松地将整数时间戳转换为DateTime对象。然后PHPToExcel在调用$dateValue-〉format()时将使用DateTime对象的时区。
DateTime时区仅在构造/修改时计算,而不在格式上计算。
使用
'@' . $timestamp
时,DateTime构造使用UTC时区。setTimestamp
使用环境的当前时区。但是
setTimestamp
直到5.3才可用在开发交钥匙解决方案时,通常最好的做法是尽量避免任何更改或试图确定其部署环境的操作。我经常在其他应用程序中修复的一个很好的示例是
date('Y-m-d', PHP_INT_MAX);
。它在32位系统上工作正常,但在64位(Windows除外)上不工作。在不同环境之间产生意外结果。6fe3ivhb3#
刚发现问题:PHPExel转换为UTC时间在:PHPExcel/Shared/Date.php
函数PHPToExcel临时将时区更改为UTC,然后返回默认时区。
解决方案很简单,但需要更改该文件。只需复制粘贴PHPToExcel函数,将其命名为PHPToExcelWithoutUTC(或任何您想要的名称),并注解以下行:
而且很管用。
编辑:它似乎是为了总是使用UTC时间默认。我不删除这个线程,因为它可能是有用的那些谁想要的用户时区。
xqkwcwgp4#
你可能会去寻找源头,
ExcelToPHP()
和PHPToExcel()
还提供了参数,以便您可以将时区从UTC转换为您自己的时区