4

我在我的一个项目中使用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');

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

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

谢谢你的帮助。

4

4 回答 4

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);
}

于 2015-03-30T16:08:06.187 回答
4

刚刚发现问题:PHPExcel 内部转换为UTC时间:PHPExcel/Shared/Date.php

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

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

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

//date_default_timezone_set($saveTimeZone);

它有效。

编辑:似乎默认情况下总是使用 UTC 时间。我不会删除这个线程,因为它可能对那些想要用户时区的人有用。

于 2012-06-04T20:45:11.173 回答
3

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

如果您不想编辑库源文件,因为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);

PHP 5 >= 5.3

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

笔记

DateTime 构造在使用'@' . $timestamp.

setTimestamp使用环境当前时区。

但是setTimestamp直到 5.3 才提供

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

于 2015-05-09T00:59:20.860 回答
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)
于 2015-07-06T04:08:33.430 回答