16

Excel のシリアル日付形式の「日付」部分を変換することについて多くの参照を見てきましたが、誰もがその「時刻」部分をスキップしているようです。

これが私がする必要があることです:

インポートする Excel ファイルがあります。PHP使用中。

Excel 日付シリアル形式 (dddddd.tttttt) に遭遇しました。これを Unix タイムスタンプ全体に変換する必要があります。

私はいくつかの異なることを試しましたが、滑らかな動きでこれを行う方法に夢中になっています.

4

4 に答える 4

52

この数式を使用して 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);

ありがとう。

于 2013-02-28T13:44:30.043 に答える
7

あなたは明らかにあまり一生懸命に見えませんでした:

PHPExcel Date 処理コードから直接取得:

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()
于 2012-06-23T20:20:49.417 に答える