【问题标题】:PhpSpreadsheet's formating the date importing from XLSXPhpSpreadsheet 格式化从 XLSX 导入的日期
【发布时间】:2018-10-26 06:14:46
【问题描述】:

美好的一天。我使用 PhpSpreadsheet 的库来导入 xlsx。

在 xlsx 的 I 列中,我有这个值 20/10/1970 00:00:00 显示为 1970-10-20 00:00:00 但是当我导入它时:

$dataArray = $spreadsheet->getActiveSheet()
->rangeToArray(
    'A2:AO3',    // The worksheet range that we want to retrieve
    NULL,        // Value that should be returned for empty cells
    NULL,        // Should formulas be calculated (the equivalent of getCalculatedValue() for each cell)
    TRUE,        // Should values be formatted (the equivalent of getFormattedValue() for each cell)
    TRUE         // Should the array be indexed by cell row and cell column
);

我收到奇怪的["I"] => float(25861) 请帮我获取该字段中的 Carbon 数据。

如果我尝试将此浮点数转换为时间戳,我会收到 01/01/1970 而不是 10/20/1970

我收到的其他日期,例如["J"] => float(43195.4092014)

【问题讨论】:

    标签: php phpspreadsheet


    【解决方案1】:

    解决该功能的另一种方法是从我们的对象 PHPSpreadSheet 获取活动工作表并更改样式如下:

    $sheet = $PhpSpreadSheetObject->getActiveSheet();
    $sheet->getStyle("A1:Z1")->getNumberFormat()->setFormatCode("YYYY-MM-DD");
    

    【讨论】:

      【解决方案2】:

      Excel 中的日期与其他软件/编程语言中的日期不同。

      Excel 从 1900-01-01 开始计数,而 UNIX 从 1970-01-01 开始计数。
      返回的数字是从 1900-01-01 开始的天数的浮点值,浮点数的分数是一天中的时间。

      例如,25861.5 是 1970-10-20 12:00(“Y-m-d h.i”)。

      要转换为 UNIX,您应该取返回值 - 25569(Excel 中为 1970-01-01)并乘以 86400(以秒为单位的一天)。

      请看这里: https://3v4l.org/AudMn

      在 Excel 中,如果您将 25861 和 25569 格式化为日期:

      你得到的另一个浮点数43195.4092013889

      echo date("Y-m-d h:i", (43195.4092013889-25569)*86400); //2018-04-05 11:49 (mind the timezones)
      

      https://3v4l.org/mMZQ4

      【讨论】:

      • 这个公式几乎可以工作,但似乎要休息一天。也就是说,使用 PHPSpreadSheet 提供的函数也是休息日。我的原始值为 43559,使用您的公式得出的结果为 2019-04-03,但电子表格单元格显示 04/04/2019(这是在美国)。使用 PHPSpreadSheet 函数感到惊讶,它还显示 2019-04-03 这是不正确的。 echo date('Y-m-d h:i',\PhpOffice\PhpSpreadsheet\Shared\Date::excelToTimestamp(43559));
      • @Dave 正如我在“注意时区”的答案中所写。 Unix 是 0 时区,美国是负数。由于您的 Excel 值对时区一无所知,因此它按原样返回该值。但是 PHP 是时区感知的,并根据输入值在 GMT 中返回您的时区中的时间。因此,将您在 GMT 之后的小时数添加到代码行中,它应该可以正常工作。
      • 感谢安德烈亚斯,它把我推向了正确的方向。
      • 为了完整起见,这里是有效的(注意使用 PHPSpreadsheet 内置函数进行日期转换 .... 14400 是美国东部现在比格林威治标准时间晚 4 小时)echo date('Y-m-d h:i',(\PhpOffice\PhpSpreadsheet\Shared\Date::excelToTimestamp(43559) + 14400));
      猜你喜欢
      • 1970-01-01
      • 2019-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多