【发布时间】:2020-01-02 21:59:17
【问题描述】:
我正在尝试在我的 arm 微处理器板上获取当前日期时间并执行一些简单的数学运算(从 GMT 更改为 EST,然后转换为日历时间)。
我已经能够通过 AT 命令获得准确的网络 GMT 时间。它以以下格式返回:“20/01/02,16:31:07-20”。我已经解析了这个 char 数组并将相关值分配给 tm struct。我可以很好地打印单个值,但是当我尝试使用strftime 打印时,应用程序就会停止。一旦我开始工作,我将如何将其转换为日历时间(从纪元开始的秒数)我认为mktime 应该可以解决问题,但我认为同样的原因也会失败。任何人都有任何想法。这是代码和输出
char datetime[] = "20/01/02,16:31:07-20";
//just hardcoded for now to get formatting and math done properly
char sep[] = " ,.-:/";
char str[30];
strcpy(str,datetime);
struct tm *timekeeper;
char* token = strtok (str, sep);
int tempyear = atoi(token);
if(tempyear < 100){
timekeeper->tm_year = 2000 + tempyear;
printk("year= %i\n",timekeeper->tm_year);
}
else{
timekeeper->tm_year = tempyear;
}
token = strtok(NULL, sep);
//months are set from 0 to 11 so -1 is needed to adjust
timekeeper->tm_mon = atoi(token) - 1;
printk("tm_mon= %i\n",timekeeper->tm_mon);
token = strtok(NULL, sep);
timekeeper->tm_mday = atoi(token);
printk("tm_day= %i\n",timekeeper->tm_mday);
token = strtok(NULL, sep);
timekeeper->tm_hour = atoi(token);
printk("tm_hour= %i\n",timekeeper->tm_hour);
token = strtok(NULL, sep);
timekeeper->tm_min = atoi(token);
printk("tm_min= %i\n",timekeeper->tm_min);
token = strtok(NULL, sep);
timekeeper->tm_sec = atoi(token);
timekeeper->tm_isdst = 0;
printk("tm_sec= %i\n",timekeeper->tm_sec);
char buffer[40];
//strftime(buffer, 26, "%Y-%m-%d %H:%M:%S", timekeeper);
//int secondsfromepoch = mktime(timekeeper);
strftime(buffer, 40, "%A", timekeeper);
printk("test\n");
printk("date and time= %s\n",buffer);
尝试了新代码:
timekeeper->tm_year = 120;
timekeeper->tm_mon = 1;
timekeeper->tm_mday = 1;
timekeeper->tm_hour = 10;
timekeeper->tm_min = 10;
timekeeper->tm_sec = 10;
timekeeper->tm_isdst = 0;
char buffer[40];
printk("year= %i\n",timekeeper->tm_year);
printk("tm_mon= %i\n",timekeeper->tm_mon);
printk("tm_day= %i\n",timekeeper->tm_mday);
printk("tm_hour= %i\n",timekeeper->tm_hour);
printk("tm_min= %i\n",timekeeper->tm_min);
printk("tm_sec= %i\n",timekeeper->tm_sec);
输出:
year= 2020
tm_mon= 0
tm_day= 2
tm_hour= 16
tm_min= 31
tm_sec= 7
新代码尝试输出:
year= 120
tm_mon= 1
tm_day= 1
tm_hour= 10
tm_min= 10
tm_sec= 10
【问题讨论】:
-
请注意Zephyr C library 是最小的,您的构建可能使用不同的 C 库。如果您使用
CONFIG_NEWLIB_LIBC选项,它将使用Newlib。那是您的问题取决于您使用的 C 库,而不是 Zephyr RTOS。