Bug module datetime ? [Résolu]

Signaler
Messages postés
410
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
12 octobre 2020
-
Messages postés
410
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
12 octobre 2020
-
Bonjour,

Windows 10 et Python 3.7.2

Je fais des test avec le module datetime en mode console, via le code très simple suivant:

from datetime import *
import sys

days = {0:'Dimanche', 1:'Lundi', 2:'Mardi', 3:'Mercredi', 4:'Jeudi', 5:'Vendredi', 6:'Samedi'}

try:
 d = date(year, month, day)
 week_day = d.isoweekday()
 print("\nC'est un %s"%days[week_day])

except:
 print('''\nErreur :''', sys.exc_info()[1])


(Je passe la saisie de day, month, year)
Il fonctionne pour n'importe quelle date et affiche le jour de la semaine correspondant
Mais lorsque day = 6, month = 1 et year = 1935, le message d'erreur s'affiche:

Erreur : 7

Car week_day = 7 au lieu d'être entre 0 et 6

Serait-ce un bug du module, ou bien cette date serait elle particulière ?

4 réponses

Messages postés
29764
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
12 octobre 2020
6 809
Bonjour,

C'est plutot que TOUS les dimanches donnent 7 : https://pythontic.com/datetime/date/isoweekday
Messages postés
410
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
12 octobre 2020
59
Bon sang, mais c'est bien sur ! :-)

Je me suis polarisé sur cette date car c'est un anniversaire ... ça a été l'arbre qui cache la foret
et m'a empêché de chercher plus loin

Et comme j'ai initialisé mon dictionnaire days avec des clés de 0 à 6 au lieur de 1 à 7

Merci Jee Pee d'avoir mis en évidence ce biais cognitif !

Pour l'anecdote, mon dictionnaire de 0 à 6 venait d'un autre programme réalisé juste avant, qui fait la même chose sans passer par le module datetime :

import re

TITLE = '''\n***********************************
* Quel jour tombe une date donnée *
***********************************\n'''

days = {0:'Dimanche', 1:'Lundi', 2:'Mardi', 3:'Mercredi', 4:'Jeudi', 5:'Vendredi', 6:'Samedi'}

#Ask for a date
while True:
	print(TITLE)
	date = input('Date (ex : 7-2-1957): ')

	if (not re.match('([0-9]+-){2}([0-9]){4}', date)):
		print('\nEntrer une date au format spécifié')
	else:
		break

#Extracts day,month,year
numbers = date.split('-')
day = int(numbers[0])
month = int(numbers[1])
year = int(numbers[2])

man=int(0.6+1/month+0.001)
mp=month+12*man
ap=year-man
jd=day+int((367*(mp-1)+5)/12+0.001)+int(365.25*(ap+4712)+0.001)
jd=jd-int(ap/100)+int(ap/400)

print('\n(Julian Day : %d)'%jd)

js=(jd-1720977)/7
js=int(7*(js-int(js))+0.001)

print('\nLe %s est un %s'%(date,days[js]))
Messages postés
29764
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
12 octobre 2020
6 809
Ce foutu indice 0 dans certains langages pour listes ou tableaux !

Il y très longtemps, en utilisant l'assembleur, et donc constituant à la main toutes les structures de données, j'ai appris que pour trouver le 1er élément, depuis l'adresse mémoire de début de la zone, on utilisait un déplacement de zéro, et pour le second, un déplacement de 1 (fois la taille de l'élément). Déplacement VS indice ou position, c'est mieux ;-)

Si tu regardes bien le lien sur la fonction, tu verras que l'exemple ne va pas aider à la compréhension de cette problématique. Comment shinter la première valeur du tableau d'indice zéro en mettant un texte bidon.

Messages postés
410
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
12 octobre 2020
59
Effectivement, ils mettent un texte bidon comme 1er élément de leur tuple daysOftheWeek

Pas très beau !

Merci encore, je vais marquer cet appel comme résolu