Windows FILETIME包含什么?试图转换为PHP日期/时间

时间:2009-03-04 18:22:03

标签: c# php datetime

我已经确定我需要将Windows FILETIME类型转换为PHP可以使用的类型。我希望这是一个PHP函数。

说我有这个值: 60 F3 47 D1 57 98 C9 01

第1步:(感谢此页面http://www.cyanwerks.com/file-format-url.html) 我知道我需要改变顺序 01 C9 98 57 D1 47 F3 60

第2步:?????

3 个答案:

答案 0 :(得分:3)

来自MSDN documentation

  

包含一个64位值,表示自1601年1月1日(UTC)以来100纳秒间隔的数量。

答案 1 :(得分:1)

感谢Hugh Bothwell回答这个问题: Help me translate long value, expressed in hex, back in to a date/time

<?php

    // strip non-hex characters
    function hexstring($str) {
        $hex = array(
                '0'=>'0',       '1'=>'1',       '2'=>'2',       '3'=>'3',       '4'=>'4',
                '5'=>'5',       '6'=>'6',       '7'=>'7',       '8'=>'8',       '9'=>'9',
                'a'=>'a',       'b'=>'b',       'c'=>'c',       'd'=>'d',       'e'=>'e',       'f'=>'f',
                'A'=>'a',       'B'=>'b',       'C'=>'c',       'D'=>'d',       'E'=>'e',       'F'=>'f'
        );

        $t = '';
        $len = strlen($str);
        for ($i=0; $i<$len; ++$i) {
                $ch = $str[$i];
                if (isset($hex[$ch]))
                        $t .= $hex[$ch];
        }

        return $t;
    }

    // swap little-endian to big-endian
    function flip_endian($str) {
        // make sure #digits is even
        if ( strlen($str) & 1 )
                $str = '0' . $str;

        $t = '';
        for ($i = strlen($str)-2; $i >= 0; $i-=2)
                $t .= substr($str, $i, 2);

        return $t;
    }

    // convert hex string to BC-int
    function hex_to_bcint($str) {
        $hex = array(
                '0'=>'0',       '1'=>'1',       '2'=>'2',       '3'=>'3',       '4'=>'4',
                '5'=>'5',       '6'=>'6',       '7'=>'7',       '8'=>'8',       '9'=>'9',
                'a'=>'10',      'b'=>'11',      'c'=>'12',      'd'=>'13',      'e'=>'14',      'f'=>'15',
                'A'=>'10',      'B'=>'11',      'C'=>'12',      'D'=>'13',      'E'=>'14',      'F'=>'15'
        );

        $bci = '0';
        $len = strlen($str);
        for ($i=0; $i<$len; ++$i) {
                $bci = bcmul($bci, '16');

                $ch = $str[$i];
                if (isset($hex[$ch]))
                        $bci = bcadd($bci, $hex[$ch]);
        }

        return $bci;
    }

    // WARNING! range clipping
    //   Windows date time has range from 29000 BC to 29000 AD
    //   Unix time only has range from 1901 AD to 2038 AD
    // WARNING! loss of accuracy
    //   Windows date time has accuracy to 0.0000001s
    //   Unix time only has accuracy to 1.0s
    function win64_to_unix($bci) {
        // Unix epoch as a Windows file date-time value
        $magicnum = '116444735995904000';

        $t = bcsub($bci, $magicnum);    // Cast to Unix epoch
        $t = bcdiv($t, '10000000', 0);  // Convert from ticks to seconds

        return $t;
    }

// get input
$dtval = isset($_GET["dt"]) ? strval($_GET["dt"]) : "0";
$dtval = hexstring($dtval);             // strip non-hex chars

// convert to quadword
$dtval = substr($dtval, 0, 16);         // clip overlength string
$dtval = str_pad($dtval, 16, '0');  // pad underlength string
$quad = flip_endian($dtval);

// convert to int
$win64_datetime = hex_to_bcint($quad);

// convert to Unix timestamp value
$unix_datetime = win64_to_unix($win64_datetime);

?><html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Windows datetime test code</title>
</head>

    <form method="get">
        <label>Datetime value: <input name="dt" type="text" value="<?php echo $dtval; ?>"/></label>
        <input type="submit" />
    </form>
    <hr />
    Result:
        Quad: <?php echo $quad; ?><br />
        Int: <?php echo $win64_datetime; ?><br />
        Unix timestamp: <?php echo $unix_datetime; ?><br />
        Date: <?php echo date("D, d F Y H:i:s e", $unix_datetime); ?><br />
<body>
</body>
</html>

答案 2 :(得分:1)

PHP需要什么样的时间?是时间吗?如果是这样,只需从unix纪元(1970-jan-01 UTC)中减去你的DateTime并获取TotalSeconds值。