【发布时间】:2022-11-12 22:10:57
【问题描述】:
我有以下代码将从GPS卫星接收到的datetime string解析为struct tm,然后使用mktime()从中获取epoch,结果在我的Debian机器上是正确的,但在我的ESP32上是错误的与ESP-IDF,您对为什么会发生这种情况有什么建议吗?夏令时或者时区东西?
#include "rs_time.h"
time_t time_from_gnss_info_time(const char * datetime_str){
time_t epoch;
struct tm tm;
sscanf(
datetime_str,
"%4d%2d%2d%2d%2d%2d",
&tm.tm_year,
&tm.tm_mon,
&tm.tm_mday,
&tm.tm_hour,
&tm.tm_min,
&tm.tm_sec
);
epoch = mktime(&tm); // result is '1462765068' or Mon May 9 03:37:48 2016
printf("the date and time is: %s %ld ",ctime(&epoch), time(NULL));
return epoch;
}
当datetime_str 为'20210913221332' 时,使用mktime() 后epoch 的值是:1462765068,ctime() 表示也是:Mon May 9 03:37:48 2016
【问题讨论】:
-
您的
tm_year用法错误:来自人ctime:int tm_year; /* Year - 1900 */。应该是2021 - 1900 = 31 -
你没有初始化
tm -
在将
tm传递给mktime之前,您必须设置tm.tm_isdst。如果不确定,您可以简单地将其设置为-1或其他负值,以表明它是未知的。您不应该让该对象未初始化,因为这可能会向mktime提供有关夏令时是否有效的错误信息。 -
@Mathieu 是的,但是 2021 - 1900 = 121 :-) 像我这样的老人还记得 Y2K,我们
year % 100错了