Bug module datetime ?

Résolu/Fermé
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 - Modifié le 7 oct. 2020 à 17:19
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 - 7 oct. 2020 à 18:55
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

jee pee Messages postés 39585 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 19 avril 2024 9 225
7 oct. 2020 à 17:52
Bonjour,

C'est plutot que TOUS les dimanches donnent 7 : https://pythontic.com/datetime/date/isoweekday
0
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
7 oct. 2020 à 18:08
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]))
0
jee pee Messages postés 39585 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 19 avril 2024 9 225
Modifié le 7 oct. 2020 à 18:40
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.

0
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
7 oct. 2020 à 18:55
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
0