COleDateTime::GetCurrentTime() を UNIX タイム スタンプに変換するにはどうすればよいですか。具体的には、値を変換して PHP で date() 関数を使用できるようにするにはどうすればよいですか?
3 に答える
COleDateTime値をPython日時オブジェクトに変換する簡単なPython関数を次に示します。他に何もない場合は、これを使用して、PHPによる取り込みのためにCOleDateTimeをPOSIX時間形式に変換できます。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)で指定されている開始日時にベース日時を作成し、日数と部分日数のタイムデルタを追加します。タイムゾーンは扱いませんが、COleDateTimeも扱いません(私が知る限り)。テストケースで他に何も機能しない場合は、日付2010-02-15と時刻0:00のPython日時オブジェクトを返します。
それはDATE タイプのように聞こえます:
DATE 型は、8 バイトの浮動小数点数を使用して実装されます。日は、1899 年 12 月 30 日午前 0 時をゼロ時刻として、整数の増分で表されます。時間の値は、数値の小数部分の絶対値として表されます。
テストコード:
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 コードが従わなければならない他の規則があるかどうかについてはわかりません。この関数を使用する場合は、テストしてから、さらに多くのサンプルで再度テストしてください。
また、これは COleDateTime の範囲よりも小さい UNIX タイムスタンプの範囲に限定されていることに注意してください。
COleDateTime::GetCurrentTime()
オブジェクトを返しますが、MSDN ドキュメントでわかる限り、文字列を出力しません。XML で取得している文字列の例を提供できれば、回答を提供するのがはるかに簡単になります。