Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHPExcel即使在设置日期\u默认\u时区\u设置之后也会得到错误的时区_Php_Timezone_Phpexcel - Fatal编程技术网

PHPExcel即使在设置日期\u默认\u时区\u设置之后也会得到错误的时区

PHPExcel即使在设置日期\u默认\u时区\u设置之后也会得到错误的时区,php,timezone,phpexcel,Php,Timezone,Phpexcel,我正在我的一个项目中使用,我遇到了一个问题。 我想在单元格中写入time()值,我正在使用它: function writeTimeLine($objActiveSheet, &$lineNumber, $timeStart, $timeEnd, $duration, $category, $client, $date, $comment) { $objActiveSheet->setCellValue('A'.$lineNumber, PHPExcel_Shared_Da

我正在我的一个项目中使用,我遇到了一个问题。 我想在单元格中写入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的bug还是我做错了什么


感谢您的帮助。

刚刚发现问题: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时间。我不会删除此线程,因为它可能对那些需要用户时区的人有用。

与其更改PHPExcel库,不如添加时差:

$timeStart+date('Z',$timeStart) 例如:
date\u default\u timezone\u set(“美国/纽约”);
函数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\u Style\u NumberFormat::FORMAT\u DATE\u TIME4);

}

授予相当旧的权限,但希望提供另一种解决方案

如果您不想编辑库源文件,因为接受整数时间戳或日期时间对象,您可以轻松地将整数时间戳转换为日期时间对象

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

DateTime时区仅根据构造/修改而不是格式计算

PHP5>=5.2

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

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

DateTime构造在使用
“@”时使用UTC时区$时间戳

setTimestamp
使用当前时区

然而,
setTimestamp
直到5.3才可用

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

您可以查找源代码

ExcelToPHP()和PHPTOEXEL()

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

它使用UTC,因为它是一个全局常数。。。如果我们将默认时区保留为用户的时区,我们会遇到很多问题,因此我们假设传递给PHPExcel的所有日期/时间值都应该是世界时,如果不是,我们将它们转换为UTC。Excel不会转换它们,所以这是非常无用的?excel文档是供最终用户使用的,它本身没有设置正确时区的选项,它需要一个VBA脚本或单元格之间的某种计算,因此如果我只想使用一个单元格一次,并且我希望它没有任何脚本(因为每次加载文件时,它都会询问我是否要在文件上启用脚本,并在默认情况下阻止scrip执行):似乎我不能(除了这里给出的解决方案).当我觉得这纯粹是负面的批评时,我会觉得很糟糕,而且感觉最近有很多这样的批评:人们说他们本可以设计或编写得更好,但大多数人从来没有下一步尝试编写自己的Excel reader/writer,甚至没有建议如何写得更好(这可以被视为积极的批评)。我知道PHPExcel有很多缺陷,当我意识到这些缺陷时,我会努力消除它们;但有时我觉得自己不想成为某个人的全天候支持热线anymore@Janis-您看过ExcelToPHP()和PHPToExcel()的代码或API文档了吗方法?它们已经有了一个可选的时区参数。这是在最初的一年中添加的posted@MarkBakerExceltoPHP使用adjustToTimezone和timezone参数。但PHPtoExcel不使用。这是一个已知的错误吗?
    /**
 *    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)