WindowsはDATE
タイプを使用して日付を表します。これは、1899年12月30日(深夜)からの日数を表すdouble
値です。Windows DATEをC++でUNIX時刻に変換する方法
DATE
をUNIXのタイムスタンプ(1970年1月1日からの秒数)の値に変換するにはどうすればよいですか?
具体的には、C++標準ライブラリと、MinGWがヘッダファイルを配布するWindowsライブラリのみを使用して、これをどのように達成できますか?
例えば、私はIShellFolder2
から日付のプロパティを取得することができます。
void MyFunc(IShellFolder2 *folder, PCUITEMID_CHILD pidl, const SHCOLUMNID *columnid) {
VARIANT* v = (VARIANT*) malloc(sizeof(VARIANT));
DATE d;
HRESULT hr = folder->GetDetailsEx(pidl, colid, v);
if (SUCCEEDED(hr)) {
hr = VariantChangeType(v, v, 0, VT_DATE);
if (SUCCEEDED(hr)) {
d = v->date;
}
VariantClear(v);
}
free(v);
// process date here
}
どのように私は、Unixのタイムスタンプ形式を使用するソフトウェアで使用するために、この値を変換するのですか?
(この特定の問題に関連するすべてのではない)現在使用されているヘッダファイル:
#include <iostream>
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <shlobj.h>
#include <shlwapi.h>
#include <propkey.h>
#include <wchar.h>
#include <shlguid.h>
#include <string>
#include <vector>
違いは(明らかに)固定秒数なので、適切な定数を加算または減算してみてください。それが 'DATE'値の特殊性のために動作しない場合は、単に"日数 "よりも厳密な定義が必要です。たぶんあなたはWindowsに 'DATE'を扱いやすいものに変換するように頼むことができます。ファイル時間? –
@ Cheersandhth.-Alf残念なことに、はい、「DATE」は[本当に毛深い]です(https://blogs.msdn.microsoft.com/ericlippert/2003/09/16/erics-complete-guide-to-vt_date/)。 – andlabs
@andlabsおそらく、単純な数学の変換はUTC時間には有効ですが、精度のために数秒遅れることがあります。この記事では、OSが扱うべきテキスト形式とDST /ローカル時間について述べています。 –