//transforme chaine 'Tue, 16 Dec 2025 23:16:38 GMT' au format heure UTC/greenwitch en un format time_t au fuseau horaire local
time_t parseRFC1123(const char* s) {
struct tm tm;
memset(&tm, 0, sizeof(tm));
char js[5] = {0};
char monthStr[4] = {0};
if (sscanf(s, "%s %d %s %d %d:%d:%d", &js, &tm.tm_mday, &monthStr, &tm.tm_year, &tm.tm_hour , &tm.tm_min, &tm.tm_sec) != 7) return 0;
tm.tm_year -= 1900;
static const char* months = "JanFebMarAprMayJunJulAugSepOctNovDec";
const char* p = strstr(months, monthStr);
if (!p) return -1;
tm.tm_mon = (p - months) / 3;
const char* oldTZ = getenv("TZ"); // IMPORTANT : on a un timestamp UTC → utiliser mktime en mode UTC
char backup[64] = {0};
if (oldTZ) strncpy(backup, oldTZ, sizeof(backup)-1);
setenv("TZ", "UTC", 1);// On force temporairement TZ=UTC
tzset();
time_t t = mktime(&tm);
if (oldTZ) // Restaurer TZ précédent
setenv("TZ", backup, 1);
else
unsetenv("TZ");
tzset();
return t;
}
void setup() {
setenv("TZ", "CET-1CEST,M3.5.0/2,M10.5.0/3", 1); // équivalent, en plus court de : CET-1CEST-2,M3.5.0/02:00:00,M10.5.0/03:00:00
tzset();
Serial.begin(115200);
struct tm timeinfo;
getLocalTime(&timeinfo);
Serial.println(timeinfo.tm_year);
// Formatage personnalisé : %d=jour, %m=mois, %Y=année, %H=heure, %M=minute, %S=seconde
Serial.println(&timeinfo, "%d/%m/%Y %H:%M:%S");
String line = "Date: Tue, 25 Dec 2025 12:44:26 GMT";
if (line.indexOf("Date: ") != 0) Serial.println("Fail 1");
time_t utc = parseRFC1123(line.substring(6, 31).c_str());
Serial.println(utc);
struct timeval tv = { .tv_sec = utc };
settimeofday(&tv, NULL);
if(!getLocalTime(&timeinfo)){
Serial.println("Erreur : Impossible d'obtenir l'heure");
}
// Formatage personnalisé : %d=jour, %m=mois, %Y=année, %H=heure, %M=minute, %S=seconde
Serial.println(&timeinfo, "%d/%m/%Y %H:%M:%S");
Serial.println(1900 + timeinfo.tm_year);
}
void loop() {
delay(10);
}