ESP32 setenv () и localtime () из строки времени UT C - PullRequest
0 голосов
/ 09 апреля 2020

пожалуйста, рассмотрите следующий код, он компилируется и запускается на плате 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 ++? Идеальным решением было бы использовать: формат как ": Европа / Рим" Спасибо

Ответы [ 2 ]

0 голосов
/ 10 апреля 2020

Строка TZ "EST + 5" может быть неизвестна ОС, что подтверждается тем фактом, что ваши выходные данные показывают время UT C. EST и EDT использовались для восточной части США или Америки / Нью-Йорка. Предполагая, что это Linux -подобная ОС, посмотрите путь к / usr / share / zoneinfo / для доступных зон или попробуйте команду tzselect , чтобы проверить можно найти правильную строку TZ.

0 голосов
/ 09 апреля 2020

Попробуйте эту последовательность функций 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().

...