PHPExel即使在设置date_default_timezone_set后也会得到错误的时区

2exbekwf  于 2022-12-21  发布在  PHP
关注(0)|答案(4)|浏览(279)

我在我的一个项目中使用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还是我在这里做错了什么?
谢谢你的帮助。

u1ehiz5o

u1ehiz5o1#

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

2w2cym1i2#

承认相当老,但想提供另一种解决方案。
如果您不想编辑库源文件,因为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));
    • 注**

使用'@' . $timestamp时,DateTime构造使用UTC时区。
setTimestamp使用环境的当前时区。
但是setTimestamp直到5.3才可用
在开发交钥匙解决方案时,通常最好的做法是尽量避免任何更改或试图确定其部署环境的操作。我经常在其他应用程序中修复的一个很好的示例是date('Y-m-d', PHP_INT_MAX);。它在32位系统上工作正常,但在64位(Windows除外)上不工作。在不同环境之间产生意外结果。

6fe3ivhb

6fe3ivhb3#

刚发现问题:PHPExel转换为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时间默认。我不删除这个线程,因为它可能是有用的那些谁想要的用户时区。

xqkwcwgp

xqkwcwgp4#

你可能会去寻找源头,

  • ExcelToPHP()
  • PHPToExcel()

还提供了参数,以便您可以将时区从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) {
    // 
}

相关问题