C++ UTC时间字符串中的ESP32 setenv()和localtime() 请考虑以下代码,在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)");

C++ UTC时间字符串中的ESP32 setenv()和localtime() 请考虑以下代码,在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)");,c++,esp32,localtime,setenv,C++,Esp32,Localtime,Setenv,产生以下输出: 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”时区的本地时间。事实上,我遵循自述,因为我使用的是ESP32板,上面写着: 要设置本地时区,请使用setenv和tzset POSIX函数。第一, 调用setenv将TZ环境变量设置

产生以下输出:

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”时区的本地时间。事实上,我遵循自述,因为我使用的是ESP32板,上面写着:

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


除我生锈的C++之外,我又犯了什么错?完美的解决方案是使用:格式如:Europe/Rome“Thank

尝试以下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函数,可能不支持操作系统可能不知道的TZ字符串“EST+5”,这是由输出显示UTC时间这一事实支持的。美国东部或美国/纽约已使用EST和EDT。假设这是一个类似Linux的操作系统,请查看/usr/share/zoneinfo/path中可用的区域,或者尝试使用tzselect命令查看是否可以找到正确的TZ字符串。

@nathanoliver今晚的问题更好吗?:)谢谢你的建议。localtime_s没有编译,而localtime(&tnow)可以工作,但结果与我的相同。