Я пытаюсь вернуть число секунд с 1970 года с функцией времени с stm32f4
карта.
У меня настроен тип данных
RTC_HandleTypeDef RtcHandle;
RTC_DateTypeDef dateStruct;
RTC_TimeTypeDef timeStruct;
Я звоню
HAL_RTC_GetTime
HAL_RTC_GetDate
и я называю эту функцию
long SystemClock::getUnixTimestamp()
struct tm timeinfo;
//Setup a tm structure based on the RTC
timeinfo.tm_wday = dateStruct.WeekDay;
timeinfo.tm_mon = dateStruct.Month - 1;
timeinfo.tm_mday = dateStruct.Date;
timeinfo.tm_year = dateStruct.Year + 100;
timeinfo.tm_hour = timeStruct.Hours;
timeinfo.tm_min = timeStruct.Minutes;
timeinfo.tm_sec = timeStruct.Seconds;
time_t rawtime = mktime(&timeinfo);
trace_printf("Current date and time are: %s\n", ctime(&rawtime));
long x = time(&rawtime);
trace_printf("time %lu\n", x);
return x;
}
я вижу
Current date and time are: Wed Apr 29 22:46:00 2015
time 1430347560
5 second later, i do another call to HAL_RTC_GetTime, HAL_RTC_GetDate, getUnixTimestamp and i get
Current date and time are: Wed Apr 29 22:46:05 2015
time 1430347560
почему время не изменено?
С помощью
printf("time %d\n", time(&rawtime));
для отображения rawtime
не подходит time_t
не обязательно int
,
Вот код, который я скопировал с http://en.cppreference.com/w/cpp/chrono/c/time отображать значение, возвращаемое time
:
#include <ctime>
#include <iostream>
int main()
{
std::time_t result = std::time(nullptr);
std::cout << std::asctime(std::localtime(&result))
<< result << " seconds since the Epoch\n";
}
Из того, что я читаю, кажется, что time()
может вернуть отрицательное значение: К чему в конечном счете относится type_t?
Unix и POSIX-совместимые системы реализуют тип time_t как
подписанный
целое число (обычно 32 или 64 бита), которое представляет количество секунд с начала эпохи Unix: полночь UTC
1 января 1970 г. (не считая високосных секунд). Некоторые системы правильно
обрабатывать отрицательные значения времени, а другие нет. Системы, использующие
32-битный тип time_t подвержен проблеме 2038 года.
Функции в time.h
Библиотека сможет обрабатывать эти отрицательные значения и переводить их в фактические даты. На самом деле, это может быть доказано на вашем компьютере, так как ctime()
работает отлично.
В вашей ситуации, если вам абсолютно необходимо количество секунд, вы захотите преобразовать / typecast возвращаемое значение time()
в долго, прежде чем распечатать его.
printf("Time : %lu", (long)time(&rawtime));