Passage heure été - hiver

Bonjour !

Vieux serpent de mer.

Pourtant, en fouinant sur le web et après avoir testé 6 codes différents, je n'ai trouvé (mal cherché...) aucun code pour Arduino réellement fonctionnel.

Celui-ci par exemple, repris dans le test ci-après, aussi évolué qu'il paraisse, est également faux.

Sauf erreur de ma part, ce code ne fonctionne pas pour le jour du passage été -> hiver (fin octobre). Il donne, par exemple, le 27 octobre 2024 comme étant un jour "Eté", alors qu'il vient de passer en jour "Hiver".

Par contre, le passage "hiver -> été" fonctionne correctement.

En convertissant le code original, cette fois sans la prise de l'heure depuis la RTC, il devient :


// Source : https://forum.arduino.cc/t/heure-dete-heure-dhiver-automatique-avec-ds1307/196851/94

// Fonctionne pour passage Hiver -> Eté.
// Ne fonctionne pas pour Eté -> hiver (un jour trop tard...).

void setup() {
  Serial.begin(9600);
	//String result =  adjustDstEurope(annee, mois, date);
  String result =  adjustDstEurope(2024, 3, 30);  // Correct.
	Serial.print("2024, 3, 30  : "); Serial.println(result);	
  result =  adjustDstEurope(2024, 3, 31);  // Correct.
  Serial.print("2024, 3, 31  : "); Serial.println(result);	
  result =  adjustDstEurope(2024, 10, 26);  // Correct.
	Serial.print("2024, 10, 26 : "); Serial.println(result);	
  result =  adjustDstEurope(2024, 10, 27);  // ****** FAUX ******************.  
  Serial.print("2024, 10, 27 : "); Serial.println(result);	
  result =  adjustDstEurope(2024, 10, 28);  // Correct.
  Serial.print("2024, 10, 28 : "); Serial.println(result);	
 }


void loop() { }


// Le code original modifié uniquement dans les 2 'return'.
// Les lignes commentées sont les lignes originales.
String adjustDstEurope(int year, int month, int day){
//int adjustDstEurope(int year, int month, int day){
	 /*
	 With: y = year. 
	 European Economic Community:
	   Begin DST: Sunday March (31 - (5*y/4 + 4) mod 7) at 1h U.T.
	   End DST: Sunday October (31 - (5*y/4 + 1) mod 7) at 1h U.T.
	   Since 1996, valid through 2099
	   (Equations by Wei-Hwa Huang (US), and Robert H. van Gent (EC))
	 Adjustig Time with DST Europe/France/Paris: UTC+1h in winter, UTC+2h in summer
	 */
	  
	  int beginDSTDate=  (31 - (5* year/4 + 4) % 7);  // last sunday of march
	  int beginDSTMonth=3;
	  
	  int endDSTDate= (31 - (5 * year /4 + 1) % 7);   // last sunday of october
	  int endDSTMonth=10;
	  // DST is valid as:
	  if (((month > beginDSTMonth) && (month < endDSTMonth))
	      || ((month == beginDSTMonth) && (day >= beginDSTDate)) 
	      || ((month == endDSTMonth) && (day <= endDSTDate)))
	  //return 7200;      // DST europe = utc +2 hour (summer time)
    return "Eté";
	  //else return 3600; // nonDST europe = utc +1 hour (winter time)
    else return "Hiver";
}


Il retourne (le contenu des parenthèses a été ajouté manuellement) :

2024, 3, 30  : Hiver     (correct)
2024, 3, 31  : Eté       (correct)
2024, 10, 26 : Eté       (correct)
2024, 10, 27 : Eté       (FAUX)
2024, 10, 28 : Hiver     (correct)

Disposez-vous d'un code fonctionnel ?

Merci pour votre aide.

Bonjour

Pour obtenir le résultat souhaité, remplacer

par

Mais il est un peu curieux de vouloir déterminer été/hiver en fonction de la date seulement, alors que l'heure intervient aussi.
Le changement d'heure a lieu le dernier dimanche (de mars ou octobre) à 01h00 UTC
Ainsi par exemple dimanche 27 octobre 2024 nous serons encore en heures d'été jusqu'à 00:59:59 UTC.

On dirait un bout de code (mal) bricolé pour enlever l'heure dans les paramètres de calcul

@ bricoleau

Merci pour votre réponse.
Attiré par le calcul de beginDSTDate et endDSTDate, je n'ai même pas pensé à regarder le code du if.
Bravo pour la perspicacité !

En ce qui concerne la notion de l'heure, je vais compléter cette fonction dans ce sens.

Le beginDSTDate et le endDSTDate contiennent bien respectivement le dernier dimanche de mars et le dernier dimanche d'octobre.
La formule est valable avec l'année sur 4 chiffres.

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