转换Excel" 41014" PHP或JavaScript中的日期到实际日期

时间:2015-05-18 14:19:31

标签: javascript php jquery mysql excel

我在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

}

3 个答案:

答案 0 :(得分:3)

直接从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()

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

使用@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