转换Excel's”;41014”;日期到PHP或JavaScript中的实际日期

Convert Excel's "41014" date to actual date in PHP or JavaScript

本文关键字:日期 JavaScript PHP Excel 41014 转换      更新时间:2023-09-26

我正在用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
}

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

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

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

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

根据@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

我认为这5位数字是朱利安格式的日期,这一定是表示日期和时间的通用数字方式,

例如,7月号CCD_ 7=>1999-05-29(通用数据库日期格式(
编号CCD_ 9=>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