Unix zaman / php zaman COleDateTime dönüştürmek nasıl?

3 Cevap php

Bu yüzden date () işlevi PHP ile kullanabilirsiniz Nasıl bir COleDateTime :: GetCurrentTime () bir unix zaman damgası dönüştürmek ya da daha spesifik olarak ben değerini dönüştürmek istiyorsunuz?

3 Cevap

İşte DATE type gibi geliyor:

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 kodu:

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

baskılar 40224.000000.

Ben herhangi bir "yerli" php tarih / saat değeri (gerçi yanlış olabilir) bu geri dönüştürmek için yerleşik bir işlevi olduğunu sanmıyorum.

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

yol

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

hangi baskılar

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.

İşte Python datetime nesnelere COleDateTime değerleri dönüştürmek için basit bir Python fonksiyon. Başka bir şey varsa, PHP tarafından yenmesi için bir POSIX zaman biçimine COleDateTime dönüştürmek için kullanabilirsiniz. Lütfen COleDateTime değer (orijinal durumda 40.224,00000000) "dateVal" kayan nokta değeri geçirilir varsayalım.

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

Ben sadece MSDN belgelerine (00:00 @ 1899-12-30) belirtilen başlangıç ​​tarih ve saatte bir baz datetime oluşturmak ve gün sayısına ve kısmi gün boyunca timedeltas ekleyin. Bu saat dilimleri ile uğraşmak değil, ama ne COleDateTime yapar (yani bildiğim kadarıyla). Eğer başka bir şey bu tarih 2010-02-15 ve saat 00:00 için bir Python datetime nesnesi döndüren, test durum için çalışır.

COleDateTime::GetCurrentTime() bir nesne döndürür, bu çıkışı kadarıyla MSDN belgelerinde söyleyebilirim bir dize değil. Eğer XML alıyorsanız dize bir örnek sağlayabilir, bu sizin için bir cevap vermek için çok daha kolay olacaktır.