【问题标题】:ESP32 setenv() and localtime() from UTC time string来自 UTC 时间字符串的 ESP32 setenv() 和 localtime()
【发布时间】:2020-07-21 10:58:56
【问题描述】:

请考虑以下代码,它可以在 ESP32 板上编译和运行:

    unsetenv("TZ");
    String payload = http.getString();
    payload.replace("\"", "");
    Serial.print("Payload: ");
    Serial.println(payload);
    const char* format = "%Y-%m-%dT%H:%M:%S";
    strptime(payload.c_str(), format,& _time);

    //debug only
    Serial.print("Chamber time(UTC): ");
    char chDate[11] = "";
    char chTime[9] = "";
    strftime(chDate, 11, "%m/%d/%Y", &_time);
    strftime(chTime, 9, "%H:%M:%S", &_time);
    Serial.print(chDate);
    Serial.print(" ");
    Serial.println(chTime);

    int epoch_time = mktime(&_time);
    timeval epoch = { epoch_time, 0 };
    const timeval* tv = &epoch;
    settimeofday(tv, NULL);



    int rcode = setenv("TZ", "EST+5", 1);
    tzset();
    Serial.print("SetEnv reply");
    Serial.println(rcode);
    //VERIFICA
    struct tm now;
    getLocalTime(&now, 0);
    Serial.println(&now, " %B %d %Y %H:%M:%S (%A)");

产生以下输出:

Payload: 2020-04-08T21:59:10.736+0000
Chamber time(UTC): 04/08/2020 21:59:10
SetEnv reply0
April 08 2020 21:59:10 (Wednesday)

在本例中,我预计最后一个日期是根据“EST+5”时区的本地时间。事实上,我按照this 自述文件,因为我使用的是 ESP32 板,上面写着:

要设置本地时区,请使用 setenv 和 tzset POSIX 函数。第一的, 调用 setenv 将 TZ 环境变量设置为正确的值 取决于设备位置。时间字符串的格式描述 在 libc 文档中。接下来,调用 tzset 更新 C 库运行时 新时区的数据。完成这些步骤后,当地时间 函数将返回正确的本地时间,采用时区偏移量和 考虑夏令时

除了生锈的 C++ 之外,我还缺少什么/做错了什么?完美的解决方案是使用:格式如 ":Europe/Rome" 谢谢

【问题讨论】:

  • @nathanoliver 今晚的问题更好吗? :)

标签: c++ esp32 localtime setenv


【解决方案1】:

操作系统可能不知道 TZ 字符串“EST+5”,因为您的输出显示了 UTC 时间。 EST 和 EDT 已用于美国东部或美国/纽约。假设这是一个类似 Linux 的操作系统,请在 /usr/share/zoneinfo/ 路径中查看可用区域,或尝试 tzselect 命令查看您是否可以找到正确的 TZ 字符串。

【讨论】:

    【解决方案2】:

    试试这个 C 函数序列:

       time_t tnow;
       time(&tnow);
       struct tm when;
       errno_t ret = localtime_s(&when, &tnow);
       // struct tm *when = localtime(&tnow); // deprecated for some compilers
    

    getLocalTime() 函数不是标准 C 函数,可能不支持 tzset()

    【讨论】:

    • 感谢您的建议。 localtime_s 未编译,而 localtime(&tnow) 有效,但结果与我的相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-24
    • 1970-01-01
    • 2017-10-08
    • 2022-11-23
    • 1970-01-01
    • 2011-08-10
    相关资源
    最近更新 更多