【问题标题】:Excel date conversion using PHP Excel使用 PHP Excel 转换 Excel 日期
【发布时间】:2012-06-22 14:15:26
【问题描述】:

我正在从 excel 中读取日期,格式为 12/5/2012 日/月/年 使用此代码阅读 .使用 PHP EXCEL

   PHPExcel_Style_NumberFormat::toFormattedString($value['A'],'YYYY-MM-DD' );

将上述日期“2012 年 12 月 5 日”转换为“2012 年 12 月 5 日”就像魅力一样工作

现在的问题是,如果日期是 18/5/2012,或者您可以说如果我设置的日期大于 12,它会在格式化后以这种格式 18/5/2012 给我这个日期 18/5/2012

我也试过这个东西

      $temp  = strtotime(  PHPExcel_Style_NumberFormat::toFormattedString($value['A'],'YYYY-MM-DD' );
      $actualdate = date('Y-m-d',$temp) ;

这也将日期“2012 年 12 月 5 日”转换正确,但在这种情况下 18/5/2012 输出为 1970-01-01

【问题讨论】:

  • 您给出的示例仍未正确转换 - 12/5/2012 从英国转换为 ISO 格式时应返回 2012-05-12
  • 是的你没注意到......为了获得这种格式 2012-05-12 我必须制作像这样的字符串格式 YYYY-DD-MM
  • 该值是 Excel DateTimestamp 还是字符串?如果是前者,为什么不使用 ExcelToPHP() 或 ExcelToPHPObject() 等 PHPExcel_Shared_Date 转换方法?如果是后者,那么你不应该使用 toFormattedString()

标签: php import-from-excel


【解决方案1】:

请使用此公式将 Excel 日期转换为 Unix 日期,然后您可以使用 "gmdate" 在 PHP 中获取实际日期:

UNIX_DATE = (EXCEL_DATE - 25569) * 86400

要将 Unix 日期转换为 Excel 日期,请使用以下公式:

EXCEL_DATE = 25569 + (UNIX_DATE / 86400)

将此公式放入变量后,您可以使用以下示例在PHP中获取真实日期:

$UNIX_DATE = ($EXCEL_DATE - 25569) * 86400;
echo gmdate("d-m-Y H:i:s", $UNIX_DATE);

【讨论】:

  • 完美。但是你能解释一下25569和86400的意义吗?
  • 我可以。 86400 是一天中的秒数 = 24 * 60 * 60。25569 是从 1900 年 1 月 1 日到 1970 年 1 月 1 日的天数。Excel 基准日期是 1900 年 1 月 1 日,Unix 是 1970 年 1 月 1 日。 UNIX 日期值从 1970 年 1 月 1 日(1969 年 12 月 31 日午夜)开始以秒为单位。因此,要从 excel 转换,您必须减去天数,然后转换为秒。
  • 我们可以使用 build-int 函数来格式化字符串吗? echo PHPExcel_Style_NumberFormat::toFormattedString(42033, 'YYYY-MM-DD');将输出 2015-01-29
  • 哦,我需要这个太糟糕了,无法弄清楚 excel 到底给了我什么样的数字。
  • 这个答案对于所有 Excel 日期都是不完整的,因为它们可以在自 1900 年 1 月 1 日以来的天数之后的一天的派系中使用逗号。
【解决方案2】:

使用 PHPExcel 时可以使用内置函数:

$excelDate = $cell->getValue(); // gives you a number like 44444, which is days since 1900
$stringDate = \PHPExcel_Style_NumberFormat::toFormattedString($excelDate, 'YYYY-MM-DD');

【讨论】:

    【解决方案3】:

    一个简单的方法...

    <?php
        $date = date_create('30-12-1899');
    
        date_add($date, date_interval_create_from_date_string("{$value['A']} days"));
        echo date_format($date, 'Y-m-d');
    

    【讨论】:

      【解决方案4】:

      您的变量似乎是一个字符串,或者需要一个美国格式的日期。
      使用 'DateTime::createFromFormat' 将日期转换为实际的日期格式

      $date = DateTime::createFromFormat('d/m/y', $value['A']);
      echo $date->format('Y-m-d');
      

      【讨论】:

      • 致命错误:在非对象上调用成员函数 format() 它给了我这个错误我正在使用 php 5.4.3
      • 如果回显不起作用,那么这是一个小问题 - PHPExcel_Style_NumberFormat::toFormattedString(DateTime::createFromFormat('d/m/y', $value['A']),'YYYY-MM-DD' );
      【解决方案5】:

      如果您使用的是 python 我通过从 xlrd lib 添加 xldate 类解决了这个问题,这里我向您展示代码(这是在 Odoo 10 模块中):

      from xlrd import open_workbook, xldate
      wb = open_workbook(file_contents=excel_file)
      data_sheets = []
      
              # Parse all data from Excel file
              for s in wb.sheets():
                  data_rows = []
                  headers = []
                  for row_key, row in enumerate(range(s.nrows)):
                      if row_key != 0:
                          data_row = {}
                          for index, col in enumerate(range(s.ncols)):
                              value = s.cell(row, col).value
                              key = headers[int(index)]
                              if key == 'Date' and (isinstance(value, float) or isinstance(value, int)):
                                  value = xldate.xldate_as_datetime(value, wb.datemode)
                                  data_row[key] = value
                              else:
                                  data_row[key] = value
      
                          data_rows.append(data_row)
                      else:
                          for index, col in enumerate(range(s.ncols)):
                              value = (s.cell(row, col).value)
                              headers.append(value)
                  data_sheets.append(data_rows)
      

      value = xldate.xldate_as_datetime(value, wb.datemode) 将返回具有正确值的日期时间对象

      【讨论】:

        猜你喜欢
        • 2011-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-06
        • 2013-04-01
        • 2018-04-12
        • 2014-01-05
        • 1970-01-01
        相关资源
        最近更新 更多