Я работаю над развитием приложения WEC7. Я хочу преобразовать текущее системное время (значение времени time_t) в структуру tm в WEC7. В Windows 7 мы можем сделать это напрямую, вызвав gmtime API.
Нов WEC7 я обнаружил библиотеку wcecompat-master, в которой реализация API gmtime выглядит следующим образом:
struct tm* gmtime(const time_t* clock)
{
FILETIME ftUtc;
SYSTEMTIME stUtc;
if (clock == NULL)
return NULL;
// convert time_t to FILETIME
UnixTimeToFileTime(*clock,&ftUtc);
// convert to SYSTEMTIME
if (!FileTimeToSystemTime(&ftUtc, &stUtc))
return NULL;
stUtc.wMilliseconds = 500;
// fill return structure
st_tm.tm_sec = stUtc.wSecond;
st_tm.tm_min = stUtc.wMinute;
st_tm.tm_hour = stUtc.wHour;
st_tm.tm_mday = stUtc.wDay;
st_tm.tm_mon = stUtc.wMonth;
st_tm.tm_year = stUtc.wYear;
st_tm.tm_wday = stUtc.wDayOfWeek;
st_tm.tm_yday = dayOfYear(stUtc.wYear, stUtc.wMonth-1, stUtc.wDay);
st_tm.tm_isdst = 0;
return &st_tm;
}
void UnixTimeToFileTime(time_t t, LPFILETIME pft)
{
// Note that LONGLONG is a 64-bit value
LONGLONG ll;
ll = Int32x32To64(t, 10000000) + 116444736000000000;
pft->dwLowDateTime = (DWORD)ll;
pft->dwHighDateTime = (DWORD)(ll >> 32);
}
Когда в WEC7 вызывается API gmtime, он возвращает год + 1900 и месяц + 1 по сравнению с Windows7.
пример: когда текущее системное время 1545258796 секунд отправляется в API gmtime, возвращаемый результат для обоих приведен ниже
- Windows7 вернул время 0118: 11: 19: 22: 33: 16
- WEC7 вернул время 2018: 12: 19: 22: 33: 16
Может ли кто-нибудь подсказать мне причину и решение для этой реализации WEC7 gmtime?