J'ai regardé la méthode ajouterHeure() qui allait dans le sens de ce que je voulait faire, Je l'ai modifiée quelque peu pour qu'on puisse entrer un décalage différent de une heure et que ce décalage puisse être positif ou négatif. Voici la modification :
void changerHeure(uint8_t *annee, uint8_t *mois, uint8_t *jour, int8_t *heure, int8_t decal) {
if (decal > 0) {
if (*heure < (24 - decal))
(*heure) += decal;
else {
*heure = (*heure + decal) % 24;
if (*jour < nbJoursMois(*annee, *mois))
(*jour)++;
else {
*jour = 1;
if (*mois < 12)
(*mois)++;
else {
*mois = 1;
(*annee)++;
}
}
}
}
else if (decal < 0) {
if (*heure + decal >= 0)
(*heure) += decal;
else {
*heure = (*heure + decal + 24);
if (*jour == 1) {
(*mois)--;
if (*mois == 0) {
(*mois) = 12;
(*annee)--;
}
*jour = nbJoursMois(*annee, *mois);
} else {
(*jour)--;
}
}
}
}
J'avais essayé de faire ce genre de méthode, mais j'avais l'impression que j'allais m'embêter avec les valeurs négatives. Du coup, j'ai écrit deux méthodes : l'une transformant un DateTime en TempsPOSIX et l'autre, l'inverse. Les voici, mais c'est vari que c'est lourding :
#define SEC_JOUR 86400
int nbJ1J[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
byte nbJM[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
unsigned long nbSec1970(String DT) { // DT sous la forme "JJ/MM/AAAA HH:MM:SS"
int nbJours = (DT.substring(6, 10).toInt() - 1970) * 365 + (DT.substring(6, 10).toInt() - 1970) / 4;
nbJours += nbJ1J[DT.substring(3, 5).toInt() - 1];
if (DT.substring(6, 10).toInt() % 4 == 0 && DT.substring(3, 5).toInt() > 2) nbJours ++;
nbJours += DT.substring(0, 2).toInt() - 1;
return nbJours * SEC_JOUR + DT.substring(11, 13).toInt() * 3600 + DT.substring(14, 16).toInt() * 60 + DT.substring(17).toInt();
}
String dateHeure(unsigned long TU) {
char dh[21];
unsigned long TUprec = 0xFFFFFFFF;
int a = 1970;
while (TU <= TUprec) {
TUprec = TU;
if (a % 4 == 0)
TU -= 366 * SEC_JOUR;
else
TU -= 365 * SEC_JOUR;
a++;
}
a--;
if (a % 4 == 0)
nbJM[1] = 29;
else
nbJM[1] = 28;
long Tr = TUprec;
byte m;
for (m = 0; m < 12; m++) {
if (Tr - (nbJM[m]) * SEC_JOUR < 0)
break;
Tr -= nbJM[m] * SEC_JOUR;
}
byte j = Tr / SEC_JOUR;
Tr = Tr % SEC_JOUR;
byte h = Tr / 3600;
Tr = Tr % 3600;
byte mn = Tr / 60;
byte s = Tr % 60;
String formatAff = F("%02d/%02d/%04d %02d:%02d:%02d"); // format de date pour l'affichage (mis en mémoire flash)
sprintf(dh, formatAff.c_str(), j + 1, m + 1, a, h, mn, s);
return dh;
}
Une petite question, dans la procédure originale, comment interprète-t-on la ligne suivante :
(annee&3) ? 28 : 29
Je me doute bien que c'est pour tenir compte des années bissextiles, mais je ne comprends pas la syntaxe "annee&3".
Cordialement.
Pierre