Bug module datetime ?

Résolu
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

  1. 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
    1. Modérateur
      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
      1. 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