2009-03-04 2 views
2

Ich habe festgestellt, dass ich einen Windows FILETIME-Typ in etwas konvertieren muss, mit dem PHP arbeiten kann. Ich möchte, dass dies eine PHP-Funktion ist.Was enthält Windows FILETIME? Versuche, in ein PHP-Datum/eine PHP-Zeit zu konvertieren

sagen, dass ich diesen Wert haben: 60 F3 47 D1 57 98 C9 01

Schritt 1: (Dank dieser Seite http://www.cyanwerks.com/file-format-url.html) Ich weiß, ich brauche, um die Bestellung 01 C9 98 57 D1 47 zu ändern F3 60

Schritt 2: ?????

+2

Sorry, kann nicht widerstehen ... Schritt 3: Profit! – chyne

Antwort

3

Vom MSDN documentation:

enthält einen 64-Bit-Wert, der die Anzahl von 100-Nanosekunden-Intervalle seit 1. Januar 1601 (UTC).

1

mit freundlicher Genehmigung von Hugh Bothwell in Antwort auf diese Frage: 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

Sie hätten den ganzen Code nicht in den drei Minuten seit dem Verfassen der Frage schreiben können. Wenn Sie also die Antwort nicht schon vorher gekannt haben, ist das nicht Ihr Code. Könnten Sie bitte die Quelle zitieren? –

+0

Iit war die Lösung von http://stackoverflow.com/questions/610603/help-me-translate-long-value-expressed-in-hex-back-in-to-a-date-time Und ich kann ' t Löschen Sie diese Frage als überflüssig. Bearbeiten der Antwort, um eine Gutschrift zu erteilen, wo sie fällig ist. – lynn

+0

Terrific. Vielen Dank! –

1

Welche Zeit ist PHP benötigen? Ist es eine Zeit_t? Wenn ja, subtrahieren Sie einfach Ihre DateTime von der Unix-Epoche (1970-jan-01 UTC) und greifen Sie den TotalSeconds-Wert.