簡體   English   中英

Excel 日期轉換使用PHP Excel

[英]Excel date conversion using PHP Excel

我正在閱讀 excel 中的日期,格式為 12/5/2012 日/月/年,使用此代碼閱讀。 使用 PHP EXCEL

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

它的工作就像將上述日期“12/5/2012”轉換為“2012-12-05”的魅力

現在的問題是,如果日期是 2012 年 5 月 18 日,或者你可以說如果我將日期設置為大於 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 它給出 output 作為 1970-01-01

請使用此公式從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);

使用PHPExcel時,您可以使用內置函數:

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

一個簡單的方法......

<?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');

您的變量似乎是一個字符串,或者期望美國格式日期。
使用'DateTime :: createFromFormat'將日期轉換為實際的日期格式

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

考慮到1664193600000 = 26.09.2022 12:00:00從 Excel 到 Unix 的答案是:

UNIX_DATE = (EXCEL_DATE - 25569) * 86400000

從 UNIX 到 Excel

EXCEL_DATE = 25569 + (UNIX_DATE / 86400000)

PHP 中的 UNIX_DATE 以毫秒為單位給出。

86400000ms對應於24 h/d * 3600 s/h * 1000 ms/s

25569是從Jan 1, 1900Jan 1, 1970的天數。

如果您正在使用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)將返回具有正確值的datetime對象

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM