将完整Excel日期串行格式转换为Unix时间戳

时间:2012-06-23 20:13:22

标签: php import-from-excel

我已经看到很多引用转换Excel序列日期格式的“日期”部分,但每个人似乎都跳过它的“时间”部分。

以下是我需要做的事情:

我有一个我正在导入的Excel文件。正在使用PHP。

我遇到了Excel Date Serial格式(dddddd.tttttt),需要将其转换为整个Unix时间戳。

我尝试了一些不同的东西,但是我已经挂断了如何以流动的方式做到这一点。

4 个答案:

答案 0 :(得分:34)

请使用此公式从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);

感谢。

答案 1 :(得分:13)

这个oneliner当然使用PHPExcel为我工作。

$date_formated = date('Y-m-d', PHPExcel_Shared_Date::ExcelToPHP($date_int_val));

答案 2 :(得分:6)

你显然看起来不太努力:

直接从PHPExcel日期处理代码中获取:

public static function ExcelToPHP($dateValue = 0) {
    if (self::$ExcelBaseDate == self::CALENDAR_WINDOWS_1900) {
        $myExcelBaseDate = 25569;
        //    Adjust for the spurious 29-Feb-1900 (Day 60)
        if ($dateValue < 60) {
            --$myExcelBaseDate;
        }
    } else {
        $myExcelBaseDate = 24107;
    }

    // Perform conversion
    if ($dateValue >= 1) {
        $utcDays = $dateValue - $myExcelBaseDate;
        $returnValue = round($utcDays * 86400);
        if (($returnValue <= PHP_INT_MAX) && ($returnValue >= -PHP_INT_MAX)) {
            $returnValue = (integer) $returnValue;
        }
    } else {
        $hours = round($dateValue * 24);
        $mins = round($dateValue * 1440) - round($hours * 60);
        $secs = round($dateValue * 86400) - round($hours * 3600) - round($mins * 60);
        $returnValue = (integer) gmmktime($hours, $mins, $secs);
    }

    // Return
    return $returnValue;
}    //    function ExcelToPHP()

根据需要设置self :: $ ExcelBaseDate == self :: CALENDAR_WINDOWS_1900以指示您正在使用的Excel基本日历:Windows 1900或Mac 1904

如果你想要一个PHP DateTime对象:

public static function ExcelToPHPObject($dateValue = 0) {
    $dateTime = self::ExcelToPHP($dateValue);
    $days = floor($dateTime / 86400);
    $time = round((($dateTime / 86400) - $days) * 86400);
    $hours = round($time / 3600);
    $minutes = round($time / 60) - ($hours * 60);
    $seconds = round($time) - ($hours * 3600) - ($minutes * 60);

    $dateObj = date_create('1-Jan-1970+'.$days.' days');
    $dateObj->setTime($hours,$minutes,$seconds);

    return $dateObj;
}    //    function ExcelToPHPObject()

答案 3 :(得分:0)

我在项目中遇到同样的问题,我正在寻找 PHP Class to Read Excel as PHP Array 。 我很幸运,我找到了 'SimpleXLSX' Class 。它可以很好地处理excel数据,但是......但是......哦!但.... :( 我意识到 Date Reading From Excel 字段存在一些问题。在excel值看起来很好但是我们的时候 试图导入它们,日期值变得不同。有些时候,我们得到正确的值有时只是一个数字,有时是浮点值。 我们一直在寻找解决方案&#39;

  

为什么发生这种情况,为什么PHP无法从EXCEL获得正确的日期

&#39; 然后在大量的护目镜之后我们找到了原因:

@Source:reading xls date in php

  

根据excel格式41397是2013-05-03 Excel存储日期和   代表自1900年1月0日以来的天数的数字,   加上24小时工作日的一小部分:ddddd.tttttt。这是   称为序​​列日期或序列日期时间。

@Source:Excel date conversion using PHP Excel

  

将Excel日期转换为Unix日期,然后将Unix日期转换为PHP日期

所以,我做了一个小帮助类来阅读Excel日期以便在PHP中使用。我希望它会帮助某人,并减少目光和努力。

以下是Read Excel as PHP Array()Parse Excel Date as PHP Date

的代码
  

初学者:

  1. 从给定的示例代码
  2. 下载SimpleXLSX.php
  3. 转换PHP数组()
  4. 中的excel数据(字段/值)
  5. 将excel日期转换为PHP
  6. 现在..是的!! Excel数据已准备好作为PHP数组进入 MySQL表......
  7.   

    这是PHP代码:

    <?php   
    /*
      EXCEL DATA EXAMPLE:
      ----------------------------
      ID      Consumer_Date  Delivery_Date   Date_of_Dispatch    Gift_Date_Created   Active_Date              Approved_Date
      536     -No-Data-      9-Nov-15        7-Nov-15            -No-Data-           10/31/2015 12:00:00 AM   4/11/2015 10:21
      537     -No-Data-      -No-Data-       7-Nov-15            -No-Data-           10/23/2015 12:00:00 AM   3/11/2015 16:24
    
    */
    
    /*
      EXCEL DATA IN PHP ARRAY FORMAT
      -------------------------------
      Array
      (
          [0] => Array
              (
                  [ID] => 536
                  [Consumer_Date] => -No-Data-
                  [Delivery_Date] => 42317
                  [Date_of_Dispatch] => 42315
                  [Gift_Date_Created] => -No-Data-
                  [Active_Date] => 10/31/2015 12:00:00 AM
                  [Approved_Date] => 42105.431574074
              )
          [1] => Array
              (
                  [ID] => 537
                  [Consumer_Date] => -No-Data-
                  [Delivery_Date] => -No-Data-
                  [Date_of_Dispatch] => 42315
                  [Gift_Date_Created] => -No-Data-
                  [Active_Date] => 10/23/2015 12:00:00 AM
                  [Approved_Date] => 42074.683958333
              )
      )
    
    */
    
    /* ----------------- */
    /* Excel_Date_Parser.php */
    /* ----------------- */
    
    
    // Numbers of days between January 1, 1900 and 1970 (including 19 leap years)
    define("MIN_DATES_DIFF", 25569);
    
    // Numbers of second in a day:
    define("SEC_IN_DAY", 86400);
    
    /** Set default timezone (will throw a notice otherwise) */
    date_default_timezone_set('Asia/Kolkata');
    
    /**
     * Class Excel_Date_Parser
     *
     * SetDateString($excel_date_value) : send excel date column value
     * GetDateString(): get your php date in Y-m-d format (MySQL)
     */
    class Excel_Date_Parser
    {
    
      /**
       * Send Excel Date String Value Here
       * @param [type] $date_from_excel [description]
       * @return instance Excel_Date_Parser
       */
      public function SetDateString($date_from_excel) {
        $this->date_from_excel = $date_from_excel;
        return $this;
      }
    
      /**
       * Set Date Format Here, default is "Y-m-d"
       * @param string $set_format_date [description]
       */
      public function SetDateFormat($set_format_date = "Y-m-d") {
        $this->set_format_date = $set_format_date;
      }
    
      /**
       * Get what format is set
       */
      public function GetDateFormat() {
        return $this->set_format_date;
      }
    
      /**
       * Return PHP date according to Set Format from Excel Date
       * @return string php date
       */
      public function GetDateString() {
    
        // if value is valid date string
        if (strtotime($this->date_from_excel)) {
    
          /**
           * Excel stores dates and times as a number representing the number of days since 1900-Jan-0,
           * plus a fractional portion of a 24 hour day: ddddd.tttttt.
           * This is called a serial date, or serial date-time.
           *
           * @source: https://stackoverflow.com/questions/17808750/reading-xls-date-in-php
           */
          if (is_float($this->date_from_excel)) {
    
            // date format 2015-25-12
            $this->SetDateFormat("Y-d-m");
            $this->date_from_excel = date($this->GetDateFormat() , (mktime(0, 0, -1, 1, $this->date_from_excel, 1900)));
          } 
          else {
    
            // date format 2015-12-25
            $this->SetDateFormat();
    
            // return converted date string in php format date format 2015-12-25
            $this->date_from_excel = date($this->GetDateFormat() , strtotime($this->date_from_excel));
          }
        }
    
        /**
         * Excel stores dates and times as a number representing the number of days since 1900-Jan-0,
         * plus a fractional portion of a 24 hour day: ddddd.tttttt .
         * This is called a serial date, or serial date-time.
         *
         * According to excel format 41397 is 2013-05-03
         * @source: https://stackoverflow.com/questions/17808750/reading-xls-date-in-php
         */
        else if (is_integer($this->date_from_excel)) {
          $this->SetDateFormat();
          $this->date_from_excel = gmdate($this->GetDateFormat() , (($this->date_from_excel - MIN_DATES_DIFF) * SEC_IN_DAY));
        }
    
        // return real value
        else {
          $this->date_from_excel = $this->date_from_excel;
        }
    
        // return date
        return $this->date_from_excel;
      }
    }
    
    
    /* ----------------- */
    /* Excel_Reader.php */
    /* ----------------- */
    
    /* Show errors */
    error_reporting(1);
    
    /* display error */
    ini_set('display_errors', 1);
    
    /**
    * Using class SimpleXLSX 
    * 
    * Big Thanks!!!! to Sergey Shuchkin, Who made Excel Reader Class
    * 
    * This class can be used to parse and retrieve data from Excel XLS spreadsheet files.
    * It can parse a given Excel XLS file by extracting its contents files and parsing the 
    * contained XML spreadsheet file.
    *
    * The class provides functions to retrieve data for the spreadsheet worksheets, rows and cells.
    *
    * @link: http://www.phpclasses.org/package/6279-PHP-Parse-and-retrieve-data-from-Excel-XLS-files.html
    * @author: Sergey Shuchkin
    * @download: http://www.phpclasses.org/browse/download/zip/package/6279/name/simple-xlsx-2013-10-13.zip
    */
    require_once 'SimpleXLSX.php';
    
    
    /* Adding my class Excel_Date_Parser */
    require_once 'Excel_Date_Parser.php';
    
    
    /**
     * [toPhpDate description]
     * @param [type] $array [description]
     */
    function toPhpDate($array) {
    
      // create class object
      $ed = new Excel_Date_Parser();
    
      // parse array and set
      $array['Consumer_Date'] = $ed->SetDateString($array['Consumer_Date'])->GetDateString();
      $array['Delivery_Date'] = $ed->SetDateString($array['Delivery_Date'])->GetDateString();
      $array['Date_of_Dispatch'] = $ed->SetDateString($array['Date_of_Dispatch'])->GetDateString();
      $array['Gift_Date_Created'] = $ed->SetDateString($array['Gift_Date_Created'])->GetDateString();
      $array['Active_Date'] = $ed->SetDateString($array['Active_Date'])->GetDateString();
      $array['Approved_Date'] = $ed->SetDateString($array['Approved_Date'])->GetDateString();
    
      // return php array
      return $array;
    }
    
    // make xls object
    $xlsx = new SimpleXLSX('Sony_RedemptionFormat 8-Dec-15.xlsx');
    
    // get excel data as array
    $Excel_Array_Data = $xlsx->rows();
    
    // Get Column Name
    $Excel_Column = $Excel_Array_Data[0];
    
    // Remove Column Name From Array
    unset($Excel_Array_Data[0]);
    
    // Rest Data is Excel Data without Column
    $Excel_Data = $Excel_Array_Data;
    
    // Combine array for inserting in database
    foreach ($Excel_Array_Data as $key => $Excel_Data) {
      $insert_data[] = array_combine($Excel_Column, $Excel_Data);
    }
    
    // show array data
    echo "<pre>", print_r($insert_data, true);
    
    // update array excel date
    $insert_data = array_map('toPhpDate', $insert_data);
    
    // show array data after update date
    echo "<pre>", print_r($insert_data, true);
    

    希望此代码可以帮助某人。我正在努力解决同样的问题所以我制作了这个小脚本以节省其他时间。

      

    快乐的PHPING !!!! :)