2009-12-02 4 views
3

Je travaille sur un système lié aux enregistrements TV.Horodatage à 18 chiffres?

J'analyse le code XML suivant d'un autre système (auquel je n'ai pas la documentation):

<Program FileName="2009.11.07-Saturday 07 November 2009.dvr-ms" SubChannel="ABC1" StartTime="633931722046825183" StopTime="633932388000119414" ActualStopTime="633932388016825183" ShareShow="True" /> 
<Program FileName="2009.11.08-Sunday 08 November 2009.dvr-ms" SubChannel="ABC1" StartTime="633932586046773253" StopTime="633933252000157907" ActualStopTime="633933252006773253" ShareShow="True" /> 
<Program FileName="2009.11.09-Monday 09 November 2009.dvr-ms" SubChannel="ABC1" StartTime="633933450046168953" StopTime="633934116000207688" ActualStopTime="633934116026168953" ShareShow="True" /> 
<Program FileName="2009.11.10-Tuesday 10 November 2009.dvr-ms" SubChannel="ABC1" StartTime="633934314046899495" StopTime="633934980000869533" ActualStopTime="633934980096899495" ShareShow="True" /> 
<Program FileName="2009.11.11-Wednesday 11 November 2009.dvr-ms" SubChannel="ABC1" StartTime="633935178054202612" StopTime="633935844000077447" ActualStopTime="633935844064202612" ShareShow="True" /> 
<Program FileName="2009.11.12-Thursday 12 November 2009.dvr-ms" SubChannel="ABC1" StartTime="633936042047633656" StopTime="633936708000009191" ActualStopTime="633936708047633656" ShareShow="True" /> 

Ma question est, personne ne reconnaît le format d'horodatage des attributs StartTime et StopTime? Je pensais que les timestamps au second avaient généralement 10 chiffres, alors d'où viennent les 8 autres? Ma conjecture est quelque chose comme la précision du fuseau horaire et de la milliseconde. J'utilise php, donc une façon spécifique de le convertir en un datetime serait bien, mais tout est bon.

+0

horodateur millisecondes à compter de l'époque ont actuellement 10 chiffres . Une fois il y avait des chiffres 3/4/5/6/etc à un horodatage "maintenant". – laura

Répondre

8

Il ressemble à C# 's DateTime tiques:

Le type de valeur DateTime représente dates et heures avec des valeurs allant de 12:00:00 minuit, le 1er Janvier, 0001 Anno Domini (ère) par 23:59:59 31 Décembre, 9999 AD (CE)

Cette ligne:

Console.WriteLine (new DateTime (633936042047633656)); 

impressions:

11/12/2009 6:30:04 AM

Si vous devez convertir ces chiffres en temps Unix, 621355968000000000L substract, qui est l'époque Unix exprimé dans ticks.

+0

Hmm, sans int 64 bits en PHP qui pourrait être un problème: P Eh bien, je vais trouver un moyen. –

+0

Ne devrait pas être trop difficile de faire ce calcul en 32 bits, avec un peu de prétraitement de chaîne. Commencez par "diviser" par un million en supprimant les 6 derniers caractères de la chaîne, puis supprimez le "6" en tête. Ensuite, soustrayez 2 du premier chiffre de la chaîne. Convertissez maintenant ce qui reste en un entier de 32 bits, et soustrayez 1355968000. – MSalters

2

Avec le gmp lib installé en php, vous pouvez le faire comme ceci:

$epoch  = '621355968000000000'; 
$newtime = gmp_sub($dateTime, $epoch); 
$newtime = gmp_div($newtime, '10000000'); 
$timestamp = gmp_strval($newtime); 

et maintenant tu as une date:

echo date('Y-m-d H:i:s', $timestamp); 
1
$dateLargeInt= "131424999530821857"; 
$secsAfterADEpoch = $dateLargeInt/(10000000); 
$ADToUnixConvertor=((1970-1601) * 365.242190) * 86400; 
// unix epoch - AD epoch * number of tropical days * seconds in a day 
$unixTsLastLogon=intval($secsAfterADEpoch-$ADToUnixConvertor); 

// unix Timestamp version of AD timestamp 
$lastlogon=date("d-m-Y", $unixTsLastLogon); // formatted date 

echo $lastlogon;