c - 使用 Zephyr RTOS 在 arm 嵌入式系统上处理日期和时间(struct tm)
问题描述
我正在尝试在我的手臂微处理器板上获取当前日期时间并执行一些简单的数学运算(从 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
解决方案
的year
字段struct tm
需要 的值year - 1900
。
因此,在您的情况下,它应该包含 value 120
,而不是2020
.
timekeeper
此外,永远不会设置指针。因此,当您尝试通过->
运算符取消引用未初始化的指针时,您调用了未定义的行为。
更改timekeeper
为实例struct tm
而不是指针:
struct tm timekeeper;
->
并将其上的运算符的任何实例调整为.
.
推荐阅读
- flutter - 如何在 Flutter 中使用 RadioListTile 作为 DropDownMenuItem 的项目
- python - 我正在使用 discord.py Rewrite 制作一个机器人,并且检查出现错误,不断返回
- postman - 如何使用 Postman 预请求脚本存储 cookie 值?
- cakephp-3.7 - CakePHP 3 自定义表单
- python - 按列绘制颜色散点图 Plotly
- ios - 在没有 Xcode 的 iPhone 上模拟 GPS 位置
- python - 我怎样才能修复在python中没有定义addr
- xml - 是否可以在不解析其子元素的情况下流式解析 XML 父元素?
- c++ - 从 QAbstractItemModel 中删除项目时 QSortFilterProxyModel 崩溃
- ms-word - 使用 pandoc 将 LaTeX 文档转换为单词——多列表格的问题