Grammalecte  Hex Artifact Content

Artifact 0f6e9ac5878d7d9e054067a941a3d9967f0b76aaa16881eb0b2e5839ae3422a7:

  • File gc_lang/fr/modules/gce_date_verif.py — part of check-in [cab4036997] at 2018-10-22 20:44:15 on branch trunk — [fr][core] prise en compte du calendrier julien (premier jet) (user: olr size: 2842)

0000: 23 23 23 23 20 47 52 41 4d 4d 41 52 20 43 48 45  #### GRAMMAR CHE
0010: 43 4b 49 4e 47 20 45 4e 47 49 4e 45 20 50 4c 55  CKING ENGINE PLU
0020: 47 49 4e 0a 0a 23 23 23 23 20 43 68 65 63 6b 20  GIN..#### Check 
0030: 64 61 74 65 20 76 61 6c 69 64 69 74 79 0a 0a 69  date validity..i
0040: 6d 70 6f 72 74 20 64 61 74 65 74 69 6d 65 0a 0a  mport datetime..
0050: 0a 5f 6c 44 61 79 20 3d 20 5b 22 6c 75 6e 64 69  ._lDay = ["lundi
0060: 22 2c 20 22 6d 61 72 64 69 22 2c 20 22 6d 65 72  ", "mardi", "mer
0070: 63 72 65 64 69 22 2c 20 22 6a 65 75 64 69 22 2c  credi", "jeudi",
0080: 20 22 76 65 6e 64 72 65 64 69 22 2c 20 22 73 61   "vendredi", "sa
0090: 6d 65 64 69 22 2c 20 22 64 69 6d 61 6e 63 68 65  medi", "dimanche
00a0: 22 5d 0a 5f 64 4d 6f 6e 74 68 20 3d 20 7b 20 22  "]._dMonth = { "
00b0: 6a 61 6e 76 69 65 72 22 3a 31 2c 20 22 66 c3 a9  janvier":1, "f..
00c0: 76 72 69 65 72 22 3a 32 2c 20 22 6d 61 72 73 22  vrier":2, "mars"
00d0: 3a 33 2c 20 22 61 76 72 69 6c 22 3a 34 2c 20 22  :3, "avril":4, "
00e0: 6d 61 69 22 3a 35 2c 20 22 6a 75 69 6e 22 3a 36  mai":5, "juin":6
00f0: 2c 20 22 6a 75 69 6c 6c 65 74 22 3a 37 2c 20 22  , "juillet":7, "
0100: 61 6f c3 bb 74 22 3a 38 2c 20 22 61 6f 75 74 22  ao..t":8, "aout"
0110: 3a 38 2c 20 22 73 65 70 74 65 6d 62 72 65 22 3a  :8, "septembre":
0120: 39 2c 20 22 6f 63 74 6f 62 72 65 22 3a 31 30 2c  9, "octobre":10,
0130: 20 22 6e 6f 76 65 6d 62 72 65 22 3a 31 31 2c 20   "novembre":11, 
0140: 22 64 c3 a9 63 65 6d 62 72 65 22 3a 31 32 20 7d  "d..cembre":12 }
0150: 0a 0a 23 20 44 61 6e 73 20 50 79 74 68 6f 6e 2c  ..# Dans Python,
0160: 20 64 61 74 65 74 69 6d 65 2e 77 65 65 6b 64 61   datetime.weekda
0170: 79 28 29 20 65 6e 76 6f 69 65 20 6c 65 20 72 c3  y() envoie le r.
0180: a9 73 75 6c 74 61 74 20 63 6f 6d 6d 65 20 73 69  .sultat comme si
0190: 20 6e 6f 75 73 20 c3 a9 74 69 6f 6e 73 20 64 61   nous ..tions da
01a0: 6e 73 20 75 6e 20 63 61 6c 65 6e 64 72 69 65 72  ns un calendrier
01b0: 20 67 72 c3 a9 67 6f 72 69 65 6e 20 75 6e 69 76   gr..gorien univ
01c0: 65 72 73 61 6c 2e 0a 23 20 68 74 74 70 73 3a 2f  ersal..# https:/
01d0: 2f 66 72 2e 77 69 6b 69 70 65 64 69 61 2e 6f 72  /fr.wikipedia.or
01e0: 67 2f 77 69 6b 69 2f 50 61 73 73 61 67 65 5f 64  g/wiki/Passage_d
01f0: 75 5f 63 61 6c 65 6e 64 72 69 65 72 5f 6a 75 6c  u_calendrier_jul
0200: 69 65 6e 5f 61 75 5f 63 61 6c 65 6e 64 72 69 65  ien_au_calendrie
0210: 72 5f 67 72 25 43 33 25 41 39 67 6f 72 69 65 6e  r_gr%C3%A9gorien
0220: 0a 23 20 53 65 6c 6f 6e 20 47 72 c3 a9 67 6f 69  .# Selon Gr..goi
0230: 72 65 2c 20 6c 65 20 6a 65 75 64 69 20 34 20 6f  re, le jeudi 4 o
0240: 63 74 6f 62 72 65 20 31 35 38 32 20 65 73 74 20  ctobre 1582 est 
0250: 69 6d 6d c3 a9 64 69 61 74 65 6d 65 6e 74 20 73  imm..diatement s
0260: 75 69 76 69 20 70 61 72 20 6c 65 20 76 65 6e 64  uivi par le vend
0270: 72 65 64 69 20 31 35 20 6f 63 74 6f 62 72 65 2e  redi 15 octobre.
0280: 0a 23 20 45 6e 20 46 72 61 6e 63 65 2c 20 6c 61  .# En France, la
0290: 20 62 61 73 63 75 6c 65 20 65 75 74 20 6c 69 65   bascule eut lie
02a0: 75 20 6c 65 20 39 20 64 c3 a9 63 65 6d 62 72 65  u le 9 d..cembre
02b0: 20 31 35 38 32 20 71 75 69 20 66 75 74 20 73 75   1582 qui fut su
02c0: 69 76 69 20 70 61 72 20 6c 65 20 32 30 20 64 c3  ivi par le 20 d.
02d0: a9 63 65 6d 62 72 65 20 31 35 38 32 2e 0a 23 20  .cembre 1582..# 
02e0: 43 e2 80 99 65 73 74 20 6c 61 20 64 61 74 65 20  C...est la date 
02f0: 72 65 74 65 6e 75 65 20 70 6f 75 72 20 6c 61 20  retenue pour la 
0300: 62 61 73 63 75 6c 65 20 64 61 6e 73 20 47 72 61  bascule dans Gra
0310: 6d 6d 61 6c 65 63 74 65 2c 20 6d 61 69 73 20 6c  mmalecte, mais l
0320: 65 20 63 61 6c 65 6e 64 72 69 65 72 20 67 72 c3  e calendrier gr.
0330: a9 67 6f 72 69 65 6e 20 66 75 74 20 61 64 6f 70  .gorien fut adop
0340: 74 c3 a9 20 64 61 6e 73 20 6c 65 20 6d 6f 6e 64  t.. dans le mond
0350: 65 20 64 69 76 65 72 73 65 6d 65 6e 74 2e 0a 23  e diversement..#
0360: 20 49 6c 20 66 61 6c 6c 75 74 20 64 65 73 20 73   Il fallut des s
0370: 69 c3 a8 63 6c 65 73 20 70 6f 75 72 20 71 75 e2  i..cles pour qu.
0380: 80 99 69 6c 20 73 6f 69 74 20 61 64 6f 70 74 c3  ..il soit adopt.
0390: a9 20 70 61 72 20 6c e2 80 99 4f 63 63 69 64 65  . par l...Occide
03a0: 6e 74 20 65 74 20 75 6e 65 20 67 72 61 6e 64 65  nt et une grande
03b0: 20 70 61 72 74 69 65 20 64 75 20 72 65 73 74 65   partie du reste
03c0: 20 64 75 20 6d 6f 6e 64 65 2e 0a 5f 64 47 72 65   du monde.._dGre
03d0: 67 6f 72 69 61 6e 54 6f 4a 75 6c 69 61 6e 20 3d  gorianToJulian =
03e0: 20 7b 0a 20 20 20 20 22 6c 75 6e 64 69 22 3a 20   {.    "lundi": 
03f0: 20 20 20 22 6a 65 75 64 69 22 2c 0a 20 20 20 20     "jeudi",.    
0400: 22 6d 61 72 64 69 22 3a 20 20 20 20 22 76 65 6e  "mardi":    "ven
0410: 64 72 65 64 69 22 2c 0a 20 20 20 20 22 6d 65 72  dredi",.    "mer
0420: 63 72 65 64 69 22 3a 20 22 73 61 6d 65 64 69 22  credi": "samedi"
0430: 2c 0a 20 20 20 20 22 6a 65 75 64 69 22 3a 20 20  ,.    "jeudi":  
0440: 20 20 22 64 69 6d 61 6e 63 68 65 22 2c 0a 20 20    "dimanche",.  
0450: 20 20 22 76 65 6e 64 72 65 64 69 22 3a 20 22 6c    "vendredi": "l
0460: 75 6e 64 69 22 2c 0a 20 20 20 20 22 73 61 6d 65  undi",.    "same
0470: 64 69 22 3a 20 20 20 22 6d 61 72 64 69 22 2c 0a  di":   "mardi",.
0480: 20 20 20 20 22 64 69 6d 61 6e 63 68 65 22 3a 20      "dimanche": 
0490: 22 6d 65 72 63 72 65 64 69 22 0a 7d 0a 0a 0a 64  "mercredi".}...d
04a0: 65 66 20 63 68 65 63 6b 44 61 74 65 20 28 73 44  ef checkDate (sD
04b0: 61 79 2c 20 73 4d 6f 6e 74 68 2c 20 73 59 65 61  ay, sMonth, sYea
04c0: 72 29 3a 0a 20 20 20 20 22 72 65 74 75 72 6e 20  r):.    "return 
04d0: 54 72 75 65 20 69 66 20 74 68 65 20 64 61 74 65  True if the date
04e0: 20 69 73 20 76 61 6c 69 64 22 0a 20 20 20 20 69   is valid".    i
04f0: 66 20 6e 6f 74 20 73 4d 6f 6e 74 68 2e 69 73 64  f not sMonth.isd
0500: 69 67 69 74 28 29 3a 0a 20 20 20 20 20 20 20 20  igit():.        
0510: 73 4d 6f 6e 74 68 20 3d 20 5f 64 4d 6f 6e 74 68  sMonth = _dMonth
0520: 2e 67 65 74 28 73 4d 6f 6e 74 68 2e 6c 6f 77 65  .get(sMonth.lowe
0530: 72 28 29 2c 20 22 31 33 22 29 0a 20 20 20 20 74  r(), "13").    t
0540: 72 79 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75  ry:.        retu
0550: 72 6e 20 64 61 74 65 74 69 6d 65 2e 64 61 74 65  rn datetime.date
0560: 28 69 6e 74 28 73 59 65 61 72 29 2c 20 69 6e 74  (int(sYear), int
0570: 28 73 4d 6f 6e 74 68 29 2c 20 69 6e 74 28 73 44  (sMonth), int(sD
0580: 61 79 29 29 0a 20 20 20 20 65 78 63 65 70 74 20  ay)).    except 
0590: 56 61 6c 75 65 45 72 72 6f 72 3a 0a 20 20 20 20  ValueError:.    
05a0: 20 20 20 20 72 65 74 75 72 6e 20 46 61 6c 73 65      return False
05b0: 0a 20 20 20 20 65 78 63 65 70 74 3a 0a 20 20 20  .    except:.   
05c0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 72 75 65       return True
05d0: 0a 0a 0a 64 65 66 20 63 68 65 63 6b 44 61 79 20  ...def checkDay 
05e0: 28 73 57 65 65 6b 64 61 79 2c 20 73 44 61 79 2c  (sWeekday, sDay,
05f0: 20 73 4d 6f 6e 74 68 2c 20 73 59 65 61 72 29 3a   sMonth, sYear):
0600: 0a 20 20 20 20 22 72 65 74 75 72 6e 20 54 72 75  .    "return Tru
0610: 65 20 69 66 20 73 57 65 65 6b 64 61 79 20 69 73  e if sWeekday is
0620: 20 76 61 6c 69 64 20 61 63 63 6f 72 64 69 6e 67   valid according
0630: 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 64 61   to the given da
0640: 74 65 22 0a 20 20 20 20 78 44 61 74 65 20 3d 20  te".    xDate = 
0650: 63 68 65 63 6b 44 61 74 65 28 73 44 61 79 2c 20  checkDate(sDay, 
0660: 73 4d 6f 6e 74 68 2c 20 73 59 65 61 72 29 0a 20  sMonth, sYear). 
0670: 20 20 20 69 66 20 78 44 61 74 65 20 61 6e 64 20     if xDate and 
0680: 5f 67 65 74 44 61 79 28 78 44 61 74 65 29 20 21  _getDay(xDate) !
0690: 3d 20 73 57 65 65 6b 64 61 79 2e 6c 6f 77 65 72  = sWeekday.lower
06a0: 28 29 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75  ():.        retu
06b0: 72 6e 20 46 61 6c 73 65 0a 20 20 20 20 23 20 69  rn False.    # i
06c0: 66 20 74 68 65 20 64 61 74 65 20 69 73 6e e2 80  f the date isn..
06d0: 99 74 20 76 61 6c 69 64 2c 20 61 6e 79 20 64 61  .t valid, any da
06e0: 79 20 69 73 20 76 61 6c 69 64 2e 0a 20 20 20 20  y is valid..    
06f0: 72 65 74 75 72 6e 20 54 72 75 65 0a 0a 0a 64 65  return True...de
0700: 66 20 67 65 74 44 61 79 20 28 73 44 61 79 2c 20  f getDay (sDay, 
0710: 73 4d 6f 6e 74 68 2c 20 73 59 65 61 72 29 3a 0a  sMonth, sYear):.
0720: 20 20 20 20 22 72 65 74 75 72 6e 20 74 68 65 20      "return the 
0730: 64 61 79 20 6f 66 20 74 68 65 20 64 61 74 65 20  day of the date 
0740: 28 69 6e 20 47 72 65 67 6f 72 69 61 6e 20 63 61  (in Gregorian ca
0750: 6c 65 6e 64 61 72 20 61 66 74 65 72 20 31 35 38  lendar after 158
0760: 32 2d 31 32 2d 32 30 2c 20 69 6e 20 4a 75 6c 69  2-12-20, in Juli
0770: 61 6e 20 63 61 6c 65 6e 64 61 72 20 62 65 66 6f  an calendar befo
0780: 72 65 20 31 35 38 32 2d 31 32 2d 30 39 29 22 0a  re 1582-12-09)".
0790: 20 20 20 20 78 44 61 74 65 20 3d 20 63 68 65 63      xDate = chec
07a0: 6b 44 61 74 65 28 73 44 61 79 2c 20 73 4d 6f 6e  kDate(sDay, sMon
07b0: 74 68 2c 20 73 59 65 61 72 29 0a 20 20 20 20 69  th, sYear).    i
07c0: 66 20 78 44 61 74 65 3a 0a 20 20 20 20 20 20 20  f xDate:.       
07d0: 20 72 65 74 75 72 6e 20 5f 67 65 74 44 61 79 28   return _getDay(
07e0: 78 44 61 74 65 29 0a 20 20 20 20 72 65 74 75 72  xDate).    retur
07f0: 6e 20 22 22 0a 0a 0a 64 65 66 20 5f 67 65 74 44  n ""...def _getD
0800: 61 79 20 28 78 44 61 74 65 29 3a 0a 20 20 20 20  ay (xDate):.    
0810: 22 72 65 74 75 72 6e 20 74 68 65 20 64 61 79 20  "return the day 
0820: 6f 66 20 74 68 65 20 64 61 74 65 20 28 69 6e 20  of the date (in 
0830: 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64  Gregorian calend
0840: 61 72 20 61 66 74 65 72 20 31 35 38 32 2d 31 32  ar after 1582-12
0850: 2d 32 30 2c 20 69 6e 20 4a 75 6c 69 61 6e 20 63  -20, in Julian c
0860: 61 6c 65 6e 64 61 72 20 62 65 66 6f 72 65 20 31  alendar before 1
0870: 35 38 32 2d 31 32 2d 30 39 29 22 0a 20 20 20 20  582-12-09)".    
0880: 69 66 20 78 44 61 74 65 2e 79 65 61 72 20 3e 20  if xDate.year > 
0890: 31 35 38 32 3a 0a 20 20 20 20 20 20 20 20 23 20  1582:.        # 
08a0: 43 61 6c 65 6e 64 72 69 65 72 20 67 72 c3 a9 67  Calendrier gr..g
08b0: 6f 72 69 65 6e 0a 20 20 20 20 20 20 20 20 72 65  orien.        re
08c0: 74 75 72 6e 20 5f 6c 44 61 79 5b 78 44 61 74 65  turn _lDay[xDate
08d0: 2e 77 65 65 6b 64 61 79 28 29 5d 0a 20 20 20 20  .weekday()].    
08e0: 69 66 20 78 44 61 74 65 2e 79 65 61 72 20 3c 20  if xDate.year < 
08f0: 31 35 38 32 3a 0a 20 20 20 20 20 20 20 20 23 20  1582:.        # 
0900: 43 61 6c 65 6e 64 72 69 65 72 20 6a 75 6c 69 65  Calendrier julie
0910: 6e 0a 20 20 20 20 20 20 20 20 73 47 72 65 67 6f  n.        sGrego
0920: 72 69 61 6e 44 61 79 20 3d 20 5f 6c 44 61 79 5b  rianDay = _lDay[
0930: 78 44 61 74 65 2e 77 65 65 6b 64 61 79 28 29 5d  xDate.weekday()]
0940: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
0950: 5f 64 47 72 65 67 6f 72 69 61 6e 54 6f 4a 75 6c  _dGregorianToJul
0960: 69 61 6e 2e 67 65 74 28 73 47 72 65 67 6f 72 69  ian.get(sGregori
0970: 61 6e 44 61 79 2c 20 22 45 72 72 65 75 72 3a 20  anDay, "Erreur: 
0980: 6a 6f 75 72 20 69 6e 63 6f 6e 6e 75 22 29 0a 20  jour inconnu"). 
0990: 20 20 20 23 20 31 35 38 32 0a 20 20 20 20 69 66     # 1582.    if
09a0: 20 78 44 61 74 65 2e 6d 6f 6e 74 68 20 3c 20 31   xDate.month < 1
09b0: 32 20 20 6f 72 20 78 44 61 74 65 2e 64 61 79 20  2  or xDate.day 
09c0: 3c 3d 20 39 3a 0a 20 20 20 20 20 20 20 20 23 20  <= 9:.        # 
09d0: 43 61 6c 65 6e 64 72 69 65 72 20 6a 75 6c 69 65  Calendrier julie
09e0: 6e 0a 20 20 20 20 20 20 20 20 73 47 72 65 67 6f  n.        sGrego
09f0: 72 69 61 6e 44 61 79 20 3d 20 5f 6c 44 61 79 5b  rianDay = _lDay[
0a00: 78 44 61 74 65 2e 77 65 65 6b 64 61 79 28 29 5d  xDate.weekday()]
0a10: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
0a20: 5f 64 47 72 65 67 6f 72 69 61 6e 54 6f 4a 75 6c  _dGregorianToJul
0a30: 69 61 6e 2e 67 65 74 28 73 47 72 65 67 6f 72 69  ian.get(sGregori
0a40: 61 6e 44 61 79 2c 20 22 45 72 72 65 75 72 3a 20  anDay, "Erreur: 
0a50: 6a 6f 75 72 20 69 6e 63 6f 6e 6e 75 22 29 0a 20  jour inconnu"). 
0a60: 20 20 20 65 6c 69 66 20 78 44 61 74 65 2e 64 61     elif xDate.da
0a70: 79 20 3e 3d 20 32 30 3a 0a 20 20 20 20 20 20 20  y >= 20:.       
0a80: 20 23 20 43 61 6c 65 6e 64 72 69 65 72 20 67 72   # Calendrier gr
0a90: c3 a9 67 6f 72 69 65 6e 0a 20 20 20 20 20 20 20  ..gorien.       
0aa0: 20 72 65 74 75 72 6e 20 5f 6c 44 61 79 5b 78 44   return _lDay[xD
0ab0: 61 74 65 2e 77 65 65 6b 64 61 79 28 29 5d 0a 20  ate.weekday()]. 
0ac0: 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20 20     else:.       
0ad0: 20 23 20 31 30 20 2d 20 31 39 20 64 c3 a9 63 65   # 10 - 19 d..ce
0ae0: 6d 62 72 65 20 31 35 38 32 3a 20 6a 6f 75 72 73  mbre 1582: jours
0af0: 20 69 6e 65 78 69 73 74 61 6e 74 73 20 65 6e 20   inexistants en 
0b00: 46 72 61 6e 63 65 2e 0a 20 20 20 20 20 20 20 20  France..        
0b10: 72 65 74 75 72 6e 20 22 22 0a                    return "".