26

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

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

将上述日期 '12/5/2012' 转换为 '2012-12-05'

现在的问题是,如果日期是 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) ;

这也将日期 '12/5/2012' 正确转换,但在这种情况下 18/5/2012 它给出的输出为 1970-01-01

4

5 回答 5

90

请使用此公式从 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);
于 2013-02-28T13:40:15.553 回答
29

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

$excelDate = $cell->getValue(); // gives you a number like 44444, which is days since 1900
$stringDate = \PHPExcel_Style_NumberFormat::toFormattedString($excelDate, 'YYYY-MM-DD');
于 2016-11-04T14:00:39.497 回答
2

一个简单的方法...

<?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');
于 2015-12-04T10:58:15.090 回答
0

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

$date = DateTime::createFromFormat('d/m/y', $value['A']);
echo $date->format('Y-m-d');
于 2012-06-20T14:53:17.487 回答
-3

如果您使用的是 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)将返回具有正确值的日期时间对象

于 2018-07-16T10:56:56.037 回答