【发布时间】:2017-03-05 18:41:03
【问题描述】:
Windows 使用DATE 类型来表示日期。这是一个double 值,表示自 1899 年 12 月 30 日午夜以来的天数。
如何将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是 really hairy。 -
@andlabs 可能一个简单的数学转换适用于 UTC 时间,但由于精度可能会相差几秒钟。那篇文章讨论了操作系统应该处理的文本格式和 DST/本地时间。
标签: c++ date winapi com unix-timestamp