【发布时间】: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