首页 > 解决方案 > 使用 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 

标签: cdatetimeembedded

解决方案


year字段struct tm需要 的值year - 1900

因此,在您的情况下,它应该包含 value 120,而不是2020.

timekeeper此外,永远不会设置指针。因此,当您尝试通过->运算符取消引用未初始化的指针时,您调用了未定义的行为

更改timekeeper为实例struct tm而不是指针:

struct tm timekeeper;

->并将其上的运算符的任何实例调整为..


推荐阅读