即使在设置date_default_timezone_set之后,PHPExcel也会收到错误的时区

Mic*_*lix 3 php timezone phpexcel

我在我的一个项目中使用了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);
}
Run Code Online (Sandbox Code Playgroud)

$ objActiveSheet引用$ objPHPExcel-> getActiveSheet()

Excel中的结果是:

20点27分39秒

当我在电脑上实际测试时,它是16:27:39

所以这是时区的问题(我住在东美洲,这是-4).但是,我在设置默认时区后包含PHPExcel文件

date_default_timezone_set('America/New_York');
Run Code Online (Sandbox Code Playgroud)

即使有时间的回声()我也看到了正确的小时(16:27:39).

这是PHPExcel的错误还是我在这里做错了什么?

谢谢你的帮助.

wit*_*ich 6

您最好添加时差,而不是更改PHPExcel库:

$timeStart + date('Z', $timeStart)

例如:

date_default_timezone_set('America/New_York');
function writeTimeLine($objActiveSheet, &$lineNumber, $timeStart, $timeEnd, $duration, $category, $client, $date, $comment)
{
    $objActiveSheet->setCellValue('A'.$lineNumber, PHPExcel_Shared_Date::PHPToExcel( $timeStart + date('Z', $timeStart) ));
    $objActiveSheet->getStyle('A'.$lineNumber)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME4);
}


fyr*_*rye 5

授予相当旧,但想提供另一种解决方案。

如果您不想编辑库源文件,因为PHPExcel_Shared_Date::PHPToExcel(1.7.8+)接受整数时间戳或 DateTime 对象,您可以轻松地将整数时间戳转换为 DateTime 对象。

然后 PHPToExcel 在调用 $dateValue->format() 时将使用 DateTime 对象的时区。

DateTime 时区仅在构造/修改时计算,而不在格式上计算。

PHP 5 <= 5.2

$timeStart = new DateTime(date("c", $timeStart));
PHPExcel_Shared_Date::PHPToExcel($timeStart);
Run Code Online (Sandbox Code Playgroud)

PHP 5 >= 5.3

$date = new DateTime();
PHPExcel_Shared_Date::PHPToExcel($date->setTimestamp($timeStart));
Run Code Online (Sandbox Code Playgroud)

笔记

DateTime 构造在使用 时使​​用 UTC 时区'@' . $timestamp

setTimestamp使用环境当前时区。

setTimestamp直到 5.3 才可用

在开发交钥匙解决方案时,通常最好的做法是尝试避免任何更改或尝试确定部署环境的行为。我经常需要在其他应用程序中修复的一个很好的例子是date('Y-m-d', PHP_INT_MAX);. 这在 32 位系统上可以正常工作,但不能在 64 位系统上(Windows 除外)。在不同环境之间产生意想不到的结果。