tags:

views:

337

answers:

2

I am working on a system related to tv recordings.

I am parsing the following xml from another system (to which i have no 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" />

My question is, does anyone recognise the timestamp format of the StartTime and StopTime attributes? I thought typically timestamps to the second had 10 digits, so where are the other 8 coming from? My guess is something like timezone and millisecond accuracy.

I am using php, so a php specific way of converting it to a datetime would be nice, but anything is good.

+6  A: 

It looks like C#'s DateTime ticks:

The DateTime value type represents dates and times with values ranging from 12:00:00 midnight, January 1, 0001 Anno Domini (Common Era) through 11:59:59 P.M., December 31, 9999 A.D. (C.E.)

This line:

Console.WriteLine (new DateTime (633936042047633656));

prints:

11/12/2009 6:30:04 AM

If you need to convert from those numbers to Unix time, substract 621355968000000000L, which is the Unix epoch expressed in ticks.

Gonzalo
Hmm, with no 64 bit int in PHP that could be an issue :P Oh well, i'll find a way.
Aaron Cowie
Shouldn't be too hard to do that math in 32 bits, with a bit of string preprocessing. First "divide" by a million by removing the last 6 characters of the string, then remove the leading "6". Next subtract 2 from the first digit of the string. Now convert what's left to a 32 bits integer, and subtract 1355968000.
MSalters
A: 

With the gmp lib installed in php you can do it like this:

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

and now you got a date:

echo date('Y-m-d H:i:s', $timestamp);
Janek