Bug module datetime ?

Résolu
Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   -  
Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   -
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. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     
    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
  2. jee pee Messages postés 31876 Date d'inscription   Statut Modérateur Dernière intervention   9 977
     
    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
  3. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     
    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