Détermination du jour de la semaine en fonction de YY/MM/DD

Bonjour / bonsoir !

J'ai retrouvé un code de bricoleau datant de 2016 ici.
Sauf erreur de ma part, pour ce jour (2024 / 7 / 16), la valeur retournée est '6', soit samedi, alors que qu'elle devrait être mardi.

Si besoin était, j'ai trouvé à cette page, le code de Sakamoto qui fonctionne, en tous cas pour les tests que j'ai effectués.

int dayofweek(int y, int m, int d) { /* 1 <= m <= 12,  y > 1752 (in the U.K.) */
  static int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
  if ( m < 3 ) y -= 1;
  return (y + y/4 - y/100 + y/400 + t[m-1] + d) % 7; 

La valeur retournée est 0 (pour dimanche), etc., 6 pour samedi.

sans tableau et avec des calculs à peu près équivalents vous pouvez faire

uint8_t calcDayOfWeek(uint16_t y, uint8_t m, uint8_t d) {
  y -= m < 3;
  uint8_t dow = (y + y/4 - y/100 + y/400 + (13*(m+1))/5 + d) % 7;
  return dow;
}

// EDIT modifié uint16_t pour l'année

2 Likes

@J-M-L
Merci pour le code !

algorithme de tomohiko sakamoto : c'est bien aussi de citer ses sources ... à moins de vouloir se la péter !

@5_cylindres :

En #1 @standardUser donne une version du code qu’il récupère sur un lien, il précise :

En #2 @J-M-L donne une autre version du code :

En aucun cas il ne se l’attribue
Il n’a rien à prouver. @J-M-L s’impose naturellement en tant que leader par ses compétences que personne n’ose remettre en cause.

Ce n’est pas la première fois que je vous trouve agressif et irrespectueux.

Ça c’est de trop :

Franchement il n’a pas besoin de ça :wink:
Vos remarques sont inappropriées et irrespectueuses …

1 Like

... ni ne cite ses sources

Elles ont déjà été citées par @standardUser
C’est une précision :wink:
Vous devriez aller vous coucher …

noyées dans un article wiki d'env. 600 lignes

non non, au post #1

bon, allez, dormez bien tous les deux

@5_cylindres

Les source sont correctement spécifiées (post #1).

Quant à rechercher la ligne correspondante à l'auteur Sakamoto, je ne vous apprendrai rien en vous disant qu'il suffit de se rendre sur la dite page et, dans la barre des menus, accéder à "Rechercher sakamoto" ; l'écran affichera directement les lignes de code sans avoir à lire (sic) '600 lignes'.

Je ne vois pas l'intérêt d'une polémique, de surcroît inappropriée (post #4), pour une simple aide à la programmation.

Post gratuit - cela semblait évident mais peut être pas à tous…

Prenez soin de vous.

L'année est "8 bits non signé" (0 à 255) et je pense que ça fausse le calcul...

@Etienne_74

Il n'y a aucune raison que le calcul soit faussé ; la valeur retournée étant comprise entre 0 et 6.

Avec ces valeurs positives (0 à +6) converties en binaire, une valeur signée ou non signée reste toujours identique (0b0000 0110). Sauf erreur de ma part !

@Etienne_74 parle de l'année qui est un paramètre sur 8 bit ce qui semble un peu court.

Effectivement c’est une erreur - on passe le modulo 256 de l’année

@5_cylindres :-1: -1

standardUser
A remarquer : tu ne cites à aucun moment la librairie / code que tu utilises pour lire l'heure, ni la plateforme utilisée.
Avec RTClib par exemple il te suffit de lire l'heure à l'aide de la méthode now(), qui retourne un objet DateTime puis de récupérer le jour de la semaine à l'aide de la méthode dayOfTheWeek() de la classe.

Avec un ESP32 ou ESP8266 en NTP (ou pas) la méthode est plus classique :
localtime() : récupération d'une structure tm
Le membre tm_wday de la structure tm te permet de récupérer le jour de la semaine.

Mais tu utilises peut être une librairie dépourvue de toute méthode appropriée.

sinon il y a la méthode de Zeller

uint8_t dayofweek(uint16_t y, uint16_t m, uint16_t d) {
    if (m < 3) {
        m += 12;
        y -= 1;
    }
    uint16_t K = y % 100;
    uint16_t J = y / 100;
    uint16_t h = (d + 13 * (m + 1) / 5 + K + K / 4 + J / 4 + 5 * J) % 7;
    return ((h + 5) % 7) + 1;
}

@hbachetti

Ah oui, merci ; j'avais oublié cette fonction !
J'utilise la library DS3231 qui effectivement possède getDOWStr().
Je vais regarder ça de plus près...