How can I convert a COleDateTime::GetCurrentTime() to a unix time stamp or more specifically I want to convert the value so I can use it in PHP with the date() function?
COleDateTime::GetCurrentTime()
returns an object, it doesn't output a string as far as I can tell in the MSDN Documentation. If you can provide an example of the string you are getting in the XML, it would be much easier to provide an answer for you.
That sounds like the DATE type:
The DATE type is implemented using an 8-byte floating-point number. Days are represented by whole number increments starting with 30 December 1899, midnight as time zero. Hour values are expressed as the absolute value of the fractional part of the number.
test code:
COleDateTime cdt(2010, 2, 15, 0, 0, 0); // 2010-02-15 12:00 AM
DATE d = cdt; // using COleDateTime::operator DATE
printf("%f", d);
prints 40224.000000
.
I don't think there is a built-in function to convert this back to any "native" php date/time value (could be wrong though).
edit: A (probably naive) starting point for a conversion function...
some sample data create by
LPCTSTR data[] = {
_T("1976-03-27 05:54:00"),
_T("1984-04-01 11:55:55"),
_T("1996-01-25 08:30:00"),
_T("2000-01-01 08:30:00"),
_T("2010-02-14 00:00:00"),
_T("2010-02-14 23:59:59"),
_T("2010-02-15 00:00:00"),
_T("2010-02-15 00:00:01"),
_T("2010-02-23 15:30:00"),
NULL
};
COleDateTime cdt;
for(int i=0; data[i]; i++) {
if ( !cdt.ParseDateTime(data[i]) ) {
_tprintf(_T("%s: error\n"), data[i]);
}
else {
_tprintf(_T("'%s'=>'%f'\n"), data[i], (DATE)cdt);
}
}
lead to
function DATE2unix($d) {
static $jd2DATE_offset = 2415019;
$date = intval($d);
$time = fmod($d, 1);
$ts = jdtounix($date+$jd2DATE_offset) + round($time*86400);
return $ts;
}
$data = array(
'1976-03-27 05:54:00'=>'27846.245833',
'1984-04-01 11:55:55'=>'30773.497164',
'1996-01-25 08:30:00'=>'35089.354167',
'2000-01-01 08:30:00'=>'36526.354167',
'2010-02-14 00:00:00'=>'40223.000000',
'2010-02-14 23:59:59'=>'40223.999988',
'2010-02-15 00:00:00'=>'40224.000000',
'2010-02-15 00:00:01'=>'40224.000012',
'2010-02-23 15:30:00'=>'40232.645833'
);
foreach($data as $target=>$d ) {
$ts = DATE2unix($d);
$date = gmdate('Y-m-d H:i:s', $ts);
echo 'd=', $d, ' | target=', $target, ' | date=', $date, ' : ', ($target===$date) ? 'ok':'error', "\n";
}
which prints
d=27846.245833 | target=1976-03-27 05:54:00 | date=1976-03-27 05:54:00 : ok
d=30773.497164 | target=1984-04-01 11:55:55 | date=1984-04-01 11:55:55 : ok
d=35089.354167 | target=1996-01-25 08:30:00 | date=1996-01-25 08:30:00 : ok
d=36526.354167 | target=2000-01-01 08:30:00 | date=2000-01-01 08:30:00 : ok
d=40223.000000 | target=2010-02-14 00:00:00 | date=2010-02-14 00:00:00 : ok
d=40223.999988 | target=2010-02-14 23:59:59 | date=2010-02-14 23:59:59 : ok
d=40224.000000 | target=2010-02-15 00:00:00 | date=2010-02-15 00:00:00 : ok
d=40224.000012 | target=2010-02-15 00:00:01 | date=2010-02-15 00:00:01 : ok
d=40232.645833 | target=2010-02-23 15:30:00 | date=2010-02-23 15:30:00 : ok
Though these 9 samples seem to work ok I'm not sure about intval()/round() and whether there are other conventions the php code must follow. If you're going to use this function, test it And then test it again with a lot more samples.
And keep in mind that this is limited to the unix timestamp range which is smaller than the range of COleDateTime.