Unix time and timezone

Bonjour
Je suis parvenu a convertir un temps Unix en H:M:S
Malheureusement l heure récupéré et en utc , quel approche faut il avoir pour le transformer en gmt ?
l'Ideal serait de la convertir avant la conversion H:M:S , mais je ne comprend pas bien ce que je doit faire
Pour le moment j ai ajouté 7200 seconds
J'utilise la Library TimeLib.h pour récupérer l heure sur internet , si cela peux m aider
Merci pour votre patience

    String sunrise = jsonBuffer["sys"]["sunrise"];
    String sunset = jsonBuffer["sys"]["sunset"];
    

    Serial.println("test unix value sunrise = " + sunrise);
       unsigned long t_unix_date1 = (strtol(sunrise.c_str(), NULL, 10) + 7200);

    printf("sunrise: %4d-%02d-%02d %02d:%02d:%02d\n", year(t_unix_date1), month(t_unix_date1), day(t_unix_date1), hour(t_unix_date1), minute(t_unix_date1), second(t_unix_date1));

    Serial.println("test unix value sunset = " + sunset);
   unsigned long t_unix_date2 = (strtol(sunset.c_str(), NULL, 10) + 7200);

    printf("sunset: %4d-%02d-%02d %02d:%02d:%02d\n", year(t_unix_date2), month(t_unix_date2), day(t_unix_date2), hour(t_unix_date2), minute(t_unix_date2), second(t_unix_date2));

Le soucis avec le décalage en dure est lorsque l'on va passer à l'heure d'hiver.
Ta librairie n'a pas une fonction pour définir la time zone ?

Je suis totalement conscient de cela =s d ou mes questions

J'ai une suggestion : si tu annoncais sur quelle plateforme tu bosses ?

oops pardon , je bosse sous un esp32

GMT c'est Greenwich Mean Time. Je pense que tu veux plutôt parler de l'heure locale française ?

Tu n'utilises pas NTP ?
Parce qu'avec NTP c'est plus simple :

// en global : 
const char* ntpServer = "pool.ntp.org";
// dans setup() : 
  configTzTime("CET-1CEST-2,M3.5.0/02:00:00,M10.5.0/03:00:00", ntpServer);

Jusque là nous avons simplement configuré la timezone avec les changements d'heure été hiver.

Ce qui m'étonne est que tu récupères l'heure avec une String :
String sunrise = jsonBuffer["sys"]["sunrise"];
Alors qu'à mon avis ceci doit être possible :
time_t sunrise = jsonBuffer["sys"]["sunrise"];

Ensuite on utilise les fonctions classiques :

  struct tm *pTime;
  char buffer[20];
  pTime = localtime(&sunrise);
  strftime(buffer, 20, "%H:%M:%S", pTime);

Dans pTime tu peux récupérer les variables séparément :

struct tm {
  int tm_sec;           /* Seconds. [0-60] 1 leap second */
  int tm_min;           /* Minutes. [0-59]      */
  int tm_hour;          /* Hours.   [0-23]      */
  int tm_mday;          /* Day.     [1-31]      */
  int tm_mon;           /* Month.   [0-11]      */
  int tm_year;          /* Year - 1900.         */
  int tm_wday;          /* Day of week. [0-6]   */
  int tm_yday;          /* Days in year.[0-365] */
  int tm_isdst;         /* DST.     [-1/0/1]    */
};

pTime est un pointeur sur une structure tm, donc on accède aux différents membres avec :
pTime->tm_sec pour les secondes
etc ...

La meilleur solution est celle proposé par @hbachetti et qui est utilisé par la plupart d'entre nous.
Il est aussi possible que ta librairie propose une fonction pour définir la time zone ou le décalage avec le GMT.
Le problème est aussi que tu ne donne pas le nom de ta librairie, enfin surtout son auteur, car il y a plusieurs librairie Time.
C'est celle de PaulStoffregen?

Merci pour votre aide l exemple de hbachetti est tip top :slight_smile:

    sunriseTime = jsonBuffer["sys"]["sunrise"];
    sunsetTime = jsonBuffer["sys"]["sunset"];

    struct tm *time;
    //char buffer[20];
    time = localtime(&sunriseTime);
    //strftime(buffer, 20, "%H:%M:%S", sunrisepTime);
    Serial.println("voici l heure du sunrise ======" + String(time->tm_hour) + ":" + String(time->tm_min));

    sunriserecup = (String(time->tm_hour) + ":" + String(time->tm_min));
    minuteSunrise = ((time->tm_hour * 60) + (time->tm_min));
    Serial.println("voici le temps en minute de sunrise = " + String(minuteSunrise));
    Serial.println("voici la concatenation = "+ sunriserecup);


    time = localtime(&sunsetTime);
    //strftime(buffer, 20, "%H:%M:%S", sunrisepTime);
    Serial.println("voici l heure du sunset ======" + String(time->tm_hour) + ":" + String(time->tm_min));

    sunsetrecup = (String(time->tm_hour) + ":" + String(time->tm_min));
    minuteSunset = ((time->tm_hour * 60) + (time->tm_min));
    Serial.println("voici le temps en minute de sunrise = " + String(minuteSunset));
    Serial.println("voici la concatenation = "+ sunsetrecup);
  

OK bonne continuation.

Sur ESP32 Serial.printf() est disponible.
Serial.printf("voici la concatenation = %02d:%02d", time->tm_hour, time->tm_min);
Cela évite toutes ces conversions inutiles en String, et l'affichage aura le format HH:MM, avec donc deux chiffres.

Merci pour cette information fort utilise , cela peut il être également appliqué a la variable Sunrise ?
Car je suis confronte au probleme suivant :
si les minute sont inferieur exemple 8:05 , lorsque je print ma variable dans mon canvas j ai ceci 8:5
Merci

Je ne vois pas pourquoi cela serait applicable à Sunset et pas applicable à Sunrise.
Attention : la méthode printf() existe sur ESP8266, ESP32, pas sur AVR.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.