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