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

时间:2012-06-04 20:34:00

标签: 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);
}

$ objActiveSheet引用$ objPHPExcel-> getActiveSheet()

Excel中的结果是:

20时27分39秒

当我在计算机上实际测试时,它是16:27:39

所以这是时区的问题(我住在东美洲,这是-4)。 但是,在使用

设置默认时区后,我将包含PHPExcel文件
date_default_timezone_set('America/New_York');

即使有时间的回声(),我确实看到了正确的时间(16:27:39)。

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

感谢您的帮助。

4 个答案:

答案 0 :(得分:5)

您最好添加时差:而不是更改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);
}

答案 1 :(得分:3)

刚发现问题:PHPExcel转换为UTC时间: PHPExcel /共享/ Date.php

PHPToExcel函数暂时将时区更改为UTC,然后返回默认时区。

解决方案很简单,但需要更改该文件。 只需复制粘贴PHPToExcel函数,将其命名为PHPToExcelWithoutUTC(或您想要的任何名称)并注释以下行:

//$saveTimeZone = date_default_timezone_get();
//date_default_timezone_set('UTC');

//date_default_timezone_set($saveTimeZone);

它有效。

编辑:似乎默认情况下始终使用UTC时间。我没有删除这个帖子,因为它可能对那些想要用户时区的人有用。

答案 2 :(得分:1)

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

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

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

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

PHP 5> = 5.2

$timeStart = new DateTime(date("c", $timeStart));
PHPExcel_Shared_Date::PHPToExcel($timeStart);

PHP 5> = 5.3

$timeStart = new DateTime();
PHPExcel_Shared_Date::PHPToExcel($timeStart->setTimestamp($timeStart));

注意

  

使用'@' . $timestamp时,DateTime构造使用UTC TimeZone。

     

setTimestamp使用环境当前时区。

     

但是{5.3}

之前没有提供setTimestamp

在开发交钥匙解决方案时,通常最佳做法是尝试避免任何更改或尝试确定部署环境的内容。 我经常要在其他应用程序中修复的一个好例子是date('Y-m-d', PHP_INT_MAX);。哪个适用于32位系统,但不适用于64位(Windows除外)。在不同环境之间产生意外结果。

答案 3 :(得分:1)

您可以查看来源,

ExcelToPHP()和PHPToExcel()

https://github.com/PHPOffice/PHPExcel/blob/1.8/Classes/PHPExcel/Shared/Date.php#L115

还提供参数,以便您可以将时区从UTC转换为您的

    /**
 *    Convert a date from Excel to PHP
 *
 *    @param        integer        $dateValue            Excel date/time value
 *    @param        boolean        $adjustToTimezone    Flag indicating whether $dateValue should be treated as
 *                                                    a UST timestamp, or adjusted to UST
 *    @param        string         $timezone            The timezone for finding the adjustment from UST
 *    @return       integer        PHP serialized date/time
 */
public static function ExcelToPHP($dateValue = 0, $adjustToTimezone = false, $timezone = null)