【问题标题】:Convert Excel's "41014" date to actual date in PHP or JavaScript将 Excel 的“41014”日期转换为 PHP 或 JavaScript 中的实际日期
【发布时间】:2015-05-18 14:19:30
【问题描述】:

我正在用 PHP/Jquery 编写一些东西,允许用户从 Excel 上传 Excel 电子表格。然后它获取该电子表格中的数据并将每个单元格中的值分配给一个变量,但由于某种原因,我很难处理日期。 Excel 中的任何日期都以数字形式出现,例如 41014,而不是 04/15/2012(好像我要在 Excel 中格式化为 text)。

如何将其转换为 YYYY-MM-DD 格式,使其适合我正在使用的 mySQL 数据库的其余部分?我可以用 PHP 或 Jquery 来做,但用 jQuery 做对我来说似乎更容易。

Excel 的单元格

04/15/2012

PHP 的echo json_encode($var);

`{dateReceived: 41014}`

jQuery 的console.log(dateReceived);

41014

更新

我实际上无法获得此处提供的任何答案 - 我认为 php 答案最初有效,但由于某种原因我无法让它输出我需要的内容,但我找到了另一个简单的公式,我放入一个函数中。如果其他人正在寻找类似问题的答案,这就是我所做的:(其中 $dateValue 是 Excel 日期 41014 等...)

function convertDate($dateValue) {    

  $unixDate = ($dateValue - 25569) * 86400;
  return gmdate("Y-m-d", $unixDate);
  'where Y is YYYY, m is MM, and d is DD

}

【问题讨论】:

    标签: javascript php jquery mysql excel


    【解决方案1】:

    直接取自 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...最有可能是 1900

    如果你想要一个 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()
    

    【讨论】:

    • 哇,非常感谢!这正是我所需要的。
    • 在我的一生中,我无法让它工作.......通过更多的搜索,我找到了一个简单的公式,我将它写入一个函数。如果其他人阅读此线程以寻找答案,我已经用对我有用的解决方案更新了我的原始问题。
    • 它是类的一部分,您确实将这两个方法封装在一个类中,不是吗?还是静态调用它们?
    • 我没有。我不知道什么是 php 类——我从来没有用过,这可以解释为什么这不起作用:)
    • 哇,好读!感谢您链接它...这里有很多好东西!
    【解决方案2】:

    如果你更喜欢 JavaScript,我在 GitHub 上找到了以下公式:

    new Date((excelDate - (25567 + 2))*86400*1000)
    

    适用于您给定的日期。也许您可以尝试一下它是否返回其他值的正确日期。

    【讨论】:

      【解决方案3】:

      使用@QueryLars 的建议,这是 PHP 中最简单的工作解决方案:

      $excelDate = 43407; //2018-11-03
      $miliseconds = ($excelDate - (25567 + 2)) * 86400 * 1000;
      $seconds = $miliseconds / 1000;
      echo date("Y-m-d", $seconds); //2018-11-03
      

      【讨论】:

        【解决方案4】:

        那些5位数字我认为是儒略格式的日期,那一定是表示日期和时间的数字通用方式,

        例如七月号36309 => 1999-05-29(常用数据库日期格式)
        数字44225.403368056 => 2021-01-29 09:40:51(对于日期时间,分数代表时间)

        要进行此转换,此处使用语言 php,但可以使用类似的内置函数将其更改为任何偏好的语言

        function correctDateTime($dateTime)
        {
            # integer digits for Julian date
            $julDate = floor($dateTime);
            # The fractional digits for Julian Time
            $julTime = $dateTime - $julDate;
            # Converts to Timestamp
            $timeStamp = ($julDate > 0) ? ($julDate - 25569) * 86400 + $julTime * 86400 : $julTime * 86400;
        
           # php date function to convert local time
            return [
                "Date-Time"=>date("Y-m-d H:i:s", $timeStamp),
                "Date"=>date("Y-m-d", $timeStamp),
                "Time"=>date("H:i:s", $timeStamp)
            ];
        }
        
        $formattedValue = correctDateTime("44225.403368056");
        
        echo $formattedValue["Date-Time"] . "\n";   // 2021-01-29 09:40:51
        echo $formattedValue["Date"] . "\n";   // 2021-01-29
        echo $formattedValue["Time"] . "\n";   // 09:40:51
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-07-15
          • 2011-10-14
          • 2015-10-30
          • 1970-01-01
          • 2012-06-05
          • 2020-03-19
          • 2021-09-10
          相关资源
          最近更新 更多