Как конвертировать COledatetime в unix time / php time?

Как я могу преобразовать COleDateTime::GetCurrentTime() в метку времени Unix или, более конкретно, я хочу преобразовать значение, чтобы я мог использовать его в PHP с функцией date()?

3 ответа

Решение

Это звучит как тип DATE:

Тип DATE реализован с использованием 8-байтового числа с плавающей точкой. Дни представлены целыми числами, начиная с 30 декабря 1899 года, а полночь - нулевое время. Часовые значения выражаются как абсолютное значение дробной части числа.

тестовый код:

COleDateTime cdt(2010, 2, 15, 0, 0, 0); // 2010-02-15 12:00 AM
DATE d = cdt; // using COleDateTime::operator DATE  
printf("%f", d);

печать 40224.000000,

Я не думаю, что есть встроенная функция, чтобы преобразовать это обратно в любое "родное" значение даты / времени php (хотя это может быть неправильно).

редактировать: (вероятно, наивная) отправная точка для функции преобразования...
некоторые образцы данных, созданные с помощью

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);
  }
}

привести к

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";
}

который печатает

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

Хотя эти 9 примеров работают нормально, я не уверен насчет intval()/round() и других соглашений, которым должен следовать php-код. Если вы собираетесь использовать эту функцию, протестируйте ее, а затем протестируйте еще раз с большим количеством образцов.
И имейте в виду, что это ограничено диапазоном меток времени Unix, который меньше диапазона COleDateTime.

Вот простая функция Python для преобразования значений COleDateTime в объекты даты и времени Python. Если ничего другого, вы можете использовать это для преобразования COleDateTime в формат времени POSIX для приема PHP. Предположим, что значение COleDateTime (40224.00000000 в исходном случае) передается в значение с плавающей запятой "dateval".

def oledatetime_to_datetime(dateval):
    from datetime import datetime, timedelta
    import math

    basedate = datetime(year=1899, month=12, day=30, hour=0, minute=0)
    parts = math.modf(dateval)
    days = timedelta(parts[1])
    day_frac = timedelta(abs(parts[0]))
    return basedate + days + day_frac

Я просто создаю базовую дату и время начала, указанные в документации MSDN (1899-12-30 @ 0:00), и добавляю timedeltas для количества дней и неполных дней. Это не касается часовых поясов, но и COleDateTime (насколько я знаю). Если ничего другого не подходит для вашего теста, возвращая объект даты и времени Python для даты 2010-02-15 и времени 0:00.

COleDateTime::GetCurrentTime() возвращает объект, он не выводит строку, насколько я могу судить в документации MSDN. Если вы можете привести пример строки, которую вы получаете в XML, вам будет гораздо проще дать ответ.

Другие вопросы по тегам