__DATE__ en temps unix [Résolu]

Bonjour,

j'interroge un serveur sur la date du fichier avec une fonction php
echo filemtime("file.txt")

J'ai une réponse sous la forme d'un entier long

Je voudrais comparer avec la date de compilation obtenu avec __ DATE __ et __ TIME __

Y a bien moyen d'analyser la chaîne et de la convertir en nb de secondes depuis le 1/1/1970

Depuis des années à chaque fois que j'ai voulu faire qqchose en programmation je me suis aperçu que qq1 l'avait déjà fait

Pas trouvé sur le web, donc cela doit être hyper simple

Avez-vous une solution ?

Merci d'avance

En PHP, il serait étonnant que la fonction strftime() ne soit pas disponible.

Je pense que le plus simple est comme l'indique @hbachetti d'utiliser les fonction PHP de manipulation de date et de renvoyer cette valeur à la place d'un timestamp UNIX.

Si tu ne peux pas changer le retour de la fonction, un timestamp UNIX compte le nombre de seconde depuis le 1 janvier 1970 qui s'est écoulé.
Il suffit donc de faire quelque division pour obtenir une date humainement lisible.

Il serait dommage de re-coder strftime() à la main, en tenant compte du nombre de jours par mois, des années bissextiles, alors que cela existe tout fait.

Oui c'est sûre mais cette fonction n'existe pas sur Arduino ?
Il faut passer par Time.h et jouer avec l'heure non ?

Si, elle existe pour tous les langages : time.h, sans majuscule.

Il suffit de récupérer l'heure comme précédemment, et de la passer en paramètres à la fonction.

Je n'ai pas suffisamment décrit mon problème...
Je suis dans une fonction OTA
Je voudrais insérer dans le programme de l'ESP8266 l'heure et la date de la compilation qui est aussi la propriété du fichier quand il est sur le serveur.

Le programme se logue sur le serveur en appelant un petit fichier php qui lui renvoie le temps unix du fichier.
Dans mon fichier je voudrais avoir aussi un temps unix créé avec __ DATE __ et __TIME __
Ainsi avec une condition temps unix du fichier sur le serveur > temps unix dans le programme alors déclenchement updateOTA

Peut-être que avec TimeLib.h ou RTClib on peut faire cela mais je n'ai pas trouvé d'exemples

Tout le monde cherche à voir une date lisible. moi c'est le contraire je veux un entier long :-))

Oui, effectivement, c'est mal expliqué.

Il te faut donc utiliser la fonction inverse : mktime()

time_t	   mktime (struct tm *_timeptr);

Il te faudra remplir une structure tm, à l'aide de jour, mois, année, h, m, s, et la passer à mktime.
Pour cela il te faut bien entendu décortiquer __TIME__ et __DATE__.
__DATE__ présente la date ainsi : mar 19 2023
Ce n'est pas une mince affaire, mais je ne pense pas que tu sois débutant ...
Cela doit se trouver facilement sur le WEB.
Par exemple :

Il y a une alternative plus simple : utiliser RTClib

La classe DateTime possède un constructeur pratique :

DateTime::DateTime(const char *date, const char *time) {

Ce constructeur accepte deux chaînes :

    @param date Date string, e.g. "Apr 16 2020".
    @param time Time string, e.g. "18:34:56".

Ensuite :

    DateTime buildTime(__DATE__, __TIME__);
   uint32_t timestamp = buildTime.unixtime()

C'est tout.

J'ai testé un truc avec

#include <TimeLib.h>
tmElements_t my_time;       // time elements structure
time_t unix_timestamp;      // a timestamp

char Month[12];
int Day, Year, Hour, Min, Sec;
uint8_t monthIndex;
const char *monthName[12] = {
  "Jan", "Feb", "Mar", "Apr", "May", "Jun",
  "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };

void setup() {
  delay(2000);
  Serial.begin(115200);
  Serial.println("\n");
  //sscanf((__DATE__), "%s %d %d", Month, &Day, &Year);
  sscanf((__DATE__), "%s %d %d", Month, &my_time.Day, &my_time.Year);
  for (monthIndex = 0; monthIndex < 12; monthIndex++) {
       if (strcmp(Month, monthName[monthIndex]) == 0) break;  }
  //sscanf((__TIME__), "%d:%d:%d", &Hour, &Min, &Sec);
  sscanf((__TIME__), "%d:%d:%d", &my_time.Hour, &my_time.Minute, &my_time.Second);
   
 
   
  my_time.Month = monthIndex;      // months start from 0, so deduct 1
  my_time.Year = Year - 1970; // years since 1970, so deduct 1970

  unix_timestamp =  makeTime(my_time);
  Serial.println(unix_timestamp);
   
}

void loop() {
}

Mais depuis que j'ai tenté d'utiliser my_time l'esp reboote en permanence même si cela compile sans problème.

Je peux revenir en arrière mais je vais tenté la méthode de @ hbachetti que je remercie au passage

Mille merci c'est merveilleux de simplicité

#include "RTClib.h"

void setup() {
  delay(2000);
  Serial.begin(115200);
  Serial.println("\n");
  DateTime buildTime(__DATE__, __TIME__);
  uint32_t timestamp = buildTime.unixtime();
  Serial.println(timestamp);  }
void loop() {
  // put your main code here, to run repeatedly:

}

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