【发布时间】:2026-02-09 11:45:01
【问题描述】:
在某些多媒体元数据中,可能有以秒为单位的日期时间 UTC 时间,1904 年 1 月 1 日午夜。
据我所知,日期时间函数通常基于 C/C++ 标准库中的 1970-1-1 午夜,至少在 Visual C++ 中,是否有 C/C++/Win32-API 中的函数来转换秒从“1904-1-1 午夜”到日期时间字符串,如“hh:mm:ss MM.dd, yyyy”或其他格式字符串或结构如“struct tm”?
struct tm
{
int tm_sec; // seconds after the minute - [0, 60] including leap second
int tm_min; // minutes after the hour - [0, 59]
int tm_hour; // hours since midnight - [0, 23]
int tm_mday; // day of the month - [1, 31]
int tm_mon; // months since January - [0, 11]
int tm_year; // years since 1900
int tm_wday; // days since Sunday - [0, 6]
int tm_yday; // days since January 1 - [0, 365]
int tm_isdst; // daylight savings time flag
};
解决方案#1:
int main()
{
SYSTEMTIME systm;
memset(&systm, 0, sizeof(systm));
systm.wYear = 1904;
systm.wMonth = 1;
systm.wDay = 1;
FILETIME filetm;
if (SystemTimeToFileTime(&systm, &filetm) == FALSE){
printf("Failed to convert system time to file-time.\n");
return 0;
}
ULARGE_INTEGER nanoSeconds;
nanoSeconds.HighPart = filetm.dwHighDateTime;
nanoSeconds.LowPart = filetm.dwLowDateTime;
nanoSeconds.QuadPart += 3600ULL * 10000000; // add 1hour based on 1904/1/1 midnight
filetm.dwHighDateTime = nanoSeconds.HighPart;
filetm.dwLowDateTime = nanoSeconds.LowPart;
if (FileTimeToSystemTime(&filetm, &systm) == FALSE){
printf("Failed to convert file-time to system time.\n");
return 0;
}
printf("New system time by adding 1 hour: %d-%02d-%02d %02d:%02d:%02d.%03d\n",
systm.wYear, systm.wMonth, systm.wDay,
systm.wHour, systm.wMinute, systm.wSecond, systm.wMilliseconds);
return 0;
}
输出是
New system time by adding 1 hour: 1904-01-01 01:00:00.000
解决方案#2:
用@Howard Hinnant的date.h,也可以解决这个问题,请看他提供的示例代码https://*.com/a/49733937/3968307
【问题讨论】:
-
不,C 或 C++ 库中没有这样的函数。但这似乎并不复杂。日期数学很久以前就已经解决了。我们可以很容易地计算出某一年有多少天,每天有多少秒,还有多少毫秒。基于此,这是一个相当简单的计算。我很确定(我希望)这类问题是每个中级计算机编程课程中的常规家庭作业。
-
您可以使用 c++11 标准中的 std::chrono 在午夜 1904 年 1 月 1 日创建
time_point,然后添加秒数 -
它需要有多好?例如,它是否需要处理闰秒?
-
Unix 时间戳已签名,因此 32 位值可追溯到 1901 年 12 月。另一方面,Win32 API 使用可追溯到 1601 的日期格式。请参阅 SYSTEMTIME and FILETIME。
-
@KarstenKoop:unix 时代开始于 1970 年 1 月 1 日。并非所有系统都使用
int32_t。在 64 位系统上,通常使用int64_t。