时间返回的负值

时间:2015-04-30 03:08:13

标签: c++ time stm32 stm32f4discovery

我尝试使用带有stm32f4卡的时间函数返回1970年的秒数。

我已配置这些数据类型

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

为什么不修改时间?

2 个答案:

答案 0 :(得分:1)

使用

> db.system.version.save(schema)

显示printf("time %d\n", time(&rawtime)); 不合适。 rawtime不一定是time_t

以下是我从http://en.cppreference.com/w/cpp/chrono/c/time复制的一些代码,用于显示int返回的值:

time

答案 1 :(得分:0)

根据我的阅读,似乎time()可能会返回负值:What is ultimately a time_t typedef to?

  

Unix和POSIX兼容系统将time_t类型实现为   签         整数(通常为32或64位宽),表示自Unix纪元开始以来的秒数:午夜UTC   1970年1月1日(不计算闰秒)。有些系统正确   处理负时间值,而其他人则不处理。系统使用   32位time_t类型容易受到2038年问题的影响。

time.h库中的函数可以处理这些负值并将它们转换为实际日期。事实上,这可以在您的计算机上得到证明,因为ctime()工作正常。

在您的情况下,如果您绝对需要秒数,则需要在打印之前将time()的返回值转换/转换为长整数。

printf("Time : %lu", (long)time(&rawtime));