рассмотрите следующий код, он компилируется и запускается на плате 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». Фактически, я следил за этим файлом readme. , поскольку я использую плату ESP32, в которой говорится:
Чтобы установить локальный часовой пояс, используйте функции setenv и tzset POSIX. Сначала вызовите setenv, чтобы установить для переменной среды TZ правильное значение в зависимости от местоположения устройства. Формат строки времени описан в документации libc. Затем вызовите tzset, чтобы обновить данные времени выполнения библиотеки C для нового часового пояса. После выполнения этих шагов функция локального времени вернет правильное местное время с учетом смещения часового пояса и перехода на летнее время.
Что я упускаю/делаю неправильно, кроме моего ржавого С++? Идеальным решением было бы использовать: формат типа «: Европа/Рим». Спасибо.