【问题标题】:PHPExcel_Shared_Date::ExcelToPHP($val) returns default date if $val is invalid date如果 $val 是无效日期,PHPExcel_Shared_Date::ExcelToPHP($val) 返回默认日期
【发布时间】:2018-01-15 13:58:53
【问题描述】:

我有这个

new DateTime(date($format = "Y-m-d", PHPExcel_Shared_Date::ExcelToPHP($val))).

如果日期是有效日期(如 1/1/2017),一切正常,但如果我在 Excel 中输入 '30/2/2000' 之类的日期,则上面的函数会返回 '1900-01-30 00:00:00.000000'. 如果它不是有效日期,有没有办法告诉该函数不要转换?

例如,如果值不是有效日期,new DateTime 返回 FALSE,但 ExcelToPHP 始终返回 a date,我不需要。

=== 编辑 ===

显然,如果 Excel 单元格被格式化为日期,我在 PHP 中收到的值是一个数字:从01-01-1900 过去的天数。对于无效的日期,它将以字符串而不是数字的形式返回值。

我认为有两件事可以在这里起作用:

  1. 检查是数字还是字符串
  2. 转换为可读的 PHP 格式并验证该结果

我选择第二个:

$stringDate = \PHPExcel_Style_NumberFormat::toFormattedString($val, 'DD-MM-YYYY');

if (strtotime($stringDate) === false) {
  // throw error or do something if is not a valid date
}

【问题讨论】:

    标签: php excel date


    【解决方案1】:

    您可以使用strtotime()方法查看日期,然后根据条件添加会话

    if(strtotime($val) === false)
    {
      //INVALID DATE
    }
    else
    {
      new DateTime(date($format = "Y-m-d", PHPExcel_Shared_Date::ExcelToPHP($val)));  
    }
    

    【讨论】:

    • 在 Excel 中我有 1/1/1980,在 PHP 中我收到 29221。所以即使我有一个有效的日期,strtotime 也会是假的。
    • 没有@taysia09 strtotime 返回1/1/1980 的时间戳。结果是:315532800
    • 我刚试过。 $val = 29221,所以它将是 strtotime(29221) ==> false
    • 如果在 excel 中有 1/1/1980 那么为什么你在 PHP 中会收到 29221
    • 因为在 Excel 中被格式化为日期,而不是一般,我猜它是从某个日期开始计算的天数。我无法更改 Excel 文件,所以我必须使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-22
    • 1970-01-01
    相关资源
    最近更新 更多