La fonction reconnaît les dates sous forme :
N° jour (1 à 31) puis Mois en chiffres (1-12) ou en clair (court ou long) et enfin l'année sur 4 ou 2 digits (entre les 3 éléments, laissez un espace ou un tiret ou un slash).
Ou de façon explicite : Aujourd'hui, Demain, Après-demain, Hier et Avant-hier.
La fonction reconnaît les heures sous forme :
Heure puis minute et de façon facultatif les secondes (entre Heure et Minute, placez un h ou un H ou un : et entre Minute et Seconde placez un : )
La fonction transforme dans tous les formats possibles, même N° de semaine, N° de trimestre, N° se semestre, mois en clair, jour en clair …
Voir toutes les possibilités et les contraintes dans l'entête de la fonction
Voici quelques exemples :
_DateHeureTransformer("Avant hier 12h35", "jj JJ MMMM AAAA hh:mm") => Jeudi 10 Novembre 2011 12:35
_DateHeureTransformer("13/11/2011", "jj JJ MMMM AAAA - ~Se~maine ~N°N") => Dimanche 13 Novembre 2011 - Semaine N°45
D'autres dans l'entête de la fonction
N'oubliez pas ajouter #Include <Date.au3> pour utiliser cette fonction
► Afficher le texte
Code : Tout sélectionner
;--------------------------------------------------------------------------------------------------
; Fonction transformant une chaîne contenant une Date et/ou une Heure en une aute chaîne Date et/ou Heure
;
; IN $sDateHeure : Si date : La chaîne doit débuter par le N° jour (1 à 31) puis le Mois en chiffres (1-12) ou en clair (court ou long) et
; | enfin l'année sur 4 ou 2 digits.
; | Entre les 3 éléments, laissez un espace ou un tiret ou un slash
; | Ou
; | De façon explicite : Aujourd'hui, Demain, Après-demain, Hier et Avant-hier
; | Si heure : Heure puis minute et de façon facultatif les secondes
; | Entre Heure et Minute, placez un h ou un H ou un :
; | Entre Minute et Seconde placez un :
;
; $sFormatSortie : Chaine exprimant le format de sortie, utilisant ces caractères réservés
; | AAAA ou AA ........... : Année sur 4 ou 2 digits
; | M ou MM ou MMM ou MMMM : Mois sur la forme 1 digit (si possible), 2 digits, Mois en clair court (sur 3 ou 4 caractères) ou nom complet
; | J ou JJ .............. : Jour sur 1 digit (si possible) ou 2 digits
; | j ou jj .............. : Jour de la semaine en clair sur 3 caractères ou le nom complet
; | T .................... : N° de Trimestre (1 à 4)
; | S .................... : N° de Semestre (1 à 2)
; | N .................... : N° de semaine (1 à 54)
; | h ou hh .............. : Heure sur 1 digit (si possible) ou 2 digits
; | m ou mm .............. : Minute sur 1 digit (si possible) ou 2 digits
; | s ou ss .............. : Seconde sur 1 digit (si possible) ou 2 digits
; |
; | Vous pouvez ajouter n'importe quels autres caractères non réservés sans restriction,
; | pour utiliser les caractères réservés les faire précéder d'un ~ (Ex ~h pour avoir le caractères h)
;
; OUT Si OK : La date et/ou heure au format voulu
; | et @error = 0
; Si KO : Retourne un message d'erreur avec un ! en fin de texte
; | et @error = 1
;
; EXEMPLES 1) _DateHeureTransformer("29/2/12 12h34:12", "J MMM AA hh:mm:ss") => 29 Févr 12 12:34:12
; 2) _DateHeureTransformer("29 fév 12 12h34:12", "hh:mm:ss") => Le mois 'fév' n'est pas reconnu !
; 3) _DateHeureTransformer("11 novembre 2011", "jj JJ MMMM AAAA") => Vendredi 11 Novembre 2011
; 4) _DateHeureTransformer("2 novembre 11 12h34:12", "J MMM AA hh:mm:ss") => 2 Nov 11 12:34:12
; 5) _DateHeureTransformer("8-févr-12 12:34:12", "JJ/MM/AA hh:mm") => 08/02/12 12:34
; 6) _DateHeureTransformer("11 novembre 2011", "JJ/MM/AAAA hh~hmm") => L'heure doit être renseignée !
; 7) _DateHeureTransformer("12h34:12", "J M AA hh:mm:ss") => La date doit être renseignée !
; 8) _DateHeureTransformer("29/2/11 12h34:12", "J MMM AA hh:mm:ss") => Le jour doit être compris entre 1 et 28 !
; 9) _DateHeureTransformer("1/2/85 8:9:12", "AAAA-MM-JJ h~hmm") => 1985-02-01 8h09
; 10) _DateHeureTransformer("13/11/2011", "jj JJ MMMM AAAA - ~Se~maine ~N°N") => Dimanche 13 Novembre 2011 - Semaine N°45
; 11) _DateHeureTransformer("13/11/2011", "~TT-AAAA") => T4-2011
; 12) _DateHeureTransformer("13/11/2011", "~SS-AAAA") => S2-2011
; 13) _DateHeureTransformer("Aujourd'hui 12h35", "jj JJ MMMM AAAA hh:mm") => Samedi 12 Novembre 2011 12:35
; 14) _DateHeureTransformer("Avant hier 12h35", "jj JJ MMMM AAAA hh:mm") => Jeudi 10 Novembre 2011 12:35
;--------------------------------------------------------------------------------------------------
Func _DateHeureTransformer($sDateHeure, $sFormatSortie)
; Planquer le ! en fin
$sFormatSortie = StringReplace($sFormatSortie, "!", Chr(0), 0, 1)
; Tester les mots
Local $saAD[4] = ["Après-demain", "Après demain", "Apres demain", "Apres-demain"]
Local $saD[1] = ["Demain"]
Local $saA[2] = ["Aujourd'hui", "Aujourdhui"]
Local $saAH[2] = ["Avant-hier", "Avant hier"]
Local $saH[1] = ["Hier"]
$sDateHeure = __DateHeureSSTransformerADH($sDateHeure, 2, $saAD)
$sDateHeure = __DateHeureSSTransformerADH($sDateHeure, 1, $saD)
$sDateHeure = __DateHeureSSTransformerADH($sDateHeure, 0, $saA)
$sDateHeure = __DateHeureSSTransformerADH($sDateHeure, -2, $saAH)
$sDateHeure = __DateHeureSSTransformerADH($sDateHeure, -1, $saH)
; Exécuter la fonction
Local $sRetour = __DateHeureSSTransformer($sDateHeure, $sFormatSortie)
;
If StringRight($sRetour, 1) = "!" Then
Return SetError(1, 0, StringReplace($sRetour, Chr(0), "!", 0, 1))
Else
Return StringReplace($sRetour, Chr(0), "!", 0, 1)
EndIf
EndFunc
Func __DateHeureSSTransformerADH($sDateHeure, $iDelta, $saListe)
Local $i, $s
For $i = 0 To UBound($saListe) -1
If StringInStr($sDateHeure, $saListe[$i]) > 0 Then
$s = _DateAdd("d", $iDelta, @YEAR & "/" & @MON & "/" & @MDAY)
$s = StringRight($s, 2) & "/" & StringMid($s, 6, 2) & "/" & StringLeft($s, 4)
$sDateHeure = StringReplace($sDateHeure, $saListe[$i], $s)
ExitLoop
EndIf
Next
Return $sDateHeure
EndFunc
Func __DateHeureSSTransformer($sDateHeure, $sFormatSortie) ; Ne pas utiliser directement, pas par _DateHeureTransformer()
Local $i, $c, $s, $j, $iNbH, $iNbD, $iNbDH = 1, $saDH[10][2]
Local $iDelta = 0, $sRetour = $sFormatSortie
; Les séparateurs des éléments de l'heure et des élémentes des dates
Local $scH = ":h", $scD = " /-"
; La liste des mois 1)Long, 2)Court, puis le moyen de retrouver un mois
Local $saMois[13] = ["", "|Janvier|Janv|", "|Février|Févr|Fevrier|Fevr|", "|Mars|Mars|", "|Avril|Avr|", "|Mai|Mai|", "|Juin|Juin|", "|Juillet|Juil|", "|Août|Août|Aout", "|Septembre|Sept|", "|Octobre|Oct|", "|Novembre|Nov|", "|Décembre|Déc|Decembre|Dec|"]
; La liste des jours 1)Long, 2)Court
Local $sajour[8] = ["", "|Dimanche|Dim|", "|Lundi|Lun|", "|Mardi|Mar|", "|Mercredi|Mer|", "|Jeudi|Jeu|", "|Vendredi|Ven|", "|Samedi|Sam|"]
; Préserver les ~x
$sRetour = StringReplace($sRetour, "~A", Chr(1), 0, 1)
$sRetour = StringReplace($sRetour, "~M", Chr(2), 0, 1)
$sRetour = StringReplace($sRetour, "~J", Chr(3), 0, 1)
$sRetour = StringReplace($sRetour, "~h", Chr(4), 0, 1)
$sRetour = StringReplace($sRetour, "~m", Chr(5), 0, 1)
$sRetour = StringReplace($sRetour, "~s", Chr(6), 0, 1)
$sRetour = StringReplace($sRetour, "~T", Chr(7), 0, 1)
$sRetour = StringReplace($sRetour, "~S", Chr(8), 0, 1)
$sRetour = StringReplace($sRetour, "~N", Chr(9), 0, 1)
$sRetour = StringReplace($sRetour, "~j", Chr(10), 0, 1)
;
$sDateHeure = StringStripWS($sDateHeure, 7)
; Découpage en morceaux
For $i = 1 To StringLen($sDateHeure)
$c = StringMid($sDateHeure, $i, 1)
If StringInStr($scH & $scD, $c) Then
$saDH[$iNbDH][1] &= $c
$iNbDH += 1
If $iNbDH > 6 Then Return "Date et heure sur 6 positions maximum !"
If StringInStr($scH, $c) Then
$iNbH += 1
Else
$iNbD += 1
EndIf
Else
$saDH[$iNbDH][0] &= $c
EndIf
Next
; Partie Date
If $iNbD = 0 Then
If StringInStr($sRetour, "AA", 1) Or StringInStr($sRetour, "M", 1) Or StringInStr($sRetour, "J") Or StringInStr($sRetour, "T", 1) Or _
StringInStr($sRetour, "S", 1) Or StringInStr($sRetour, "N", 1) Then Return "La date doit être renseignée !"
Else
If (($iNbH > 0) And ($iNbD <> 3)) Or (($iNbH = 0) And ($iNbD <> 2)) Then Return "La date doit être en 3 éléments JJ MM AA !"
; Jour
If Not StringIsDigit($saDH[1][0]) Then Return "Le jour et le mois doivent être séparés par un / ou - ou espace !"
If StringInStr($scD, $saDH[1][1]) = 0 Then Return "Le jour doit être numérique !"
$sRetour = StringReplace($sRetour, "JJ", StringRight("0" & $saDH[1][0], 2), 0, 1)
$sRetour = StringReplace($sRetour, "J", Number($saDH[1][0]), 0, 1)
; Mois
If StringInStr($scD, $saDH[2][1]) = 0 Then Return "Le mois et l'année doivent être séparés par un / ou - ou espace !"
If StringIsDigit($saDH[2][0]) Then
If (Number($saDH[2][0]) < 1) And (Number($saDH[2][0]) > 12) Then Return "Le mois doit être compris entre 1 et 12 !"
Else
$s = "|" & $saDH[2][0] & "|"
$j = 0
For $i = 1 To 12
If StringInStr($saMois[$i], $s) Then
$j = $i
ExitLoop
EndIf
Next
If $j = 0 Then Return "Le mois '" & $saDH[2][0] & "' n'est pas reconnu !"
$saDH[2][0] = $j
EndIf
; Année
If Not StringIsDigit($saDH[3][0]) Then Return "L'année doit être numérique !"
Switch StringLen($saDH[3][0])
Case 2
If Number($saDH[3][0]) > (Number(StringRight(@YEAR, 2)) + 50) Then
$saDH[3][0] = String(Number(StringLeft(@YEAR, 2)) -1) & $saDH[3][0]
Else
$saDH[3][0] = StringLeft(@YEAR, 2) & $saDH[3][0]
EndIf
Case 4
Case Else
Return "L'année doit être un numérique de 2 ou 4 chiffres!"
EndSwitch
$sRetour = StringReplace($sRetour, "AAAA", $saDH[3][0], 0, 1)
$sRetour = StringReplace($sRetour, "AA", StringRight($saDH[3][0], 2), 0, 1)
; Contrôle du nombre de jours
$j = _DateDaysInMonth($saDH[3][0], $saDH[2][0])
If (Number($saDH[1][0]) < 1) Or (Number($saDH[1][0]) > $j) Then Return "Le jour doit être compris entre 1 et " & $j & " !"
; Nom du jour - Remplacer provisoirement par Chr(x)
$sRetour = StringReplace($sRetour, "jj", Chr(15) & _DateToDayOfWeek(Number($saDH[3][0]), Number($saDH[2][0]), Number($saDH[1][0])), 0, 1)
$sRetour = StringReplace($sRetour, "j", Chr(14) & _DateToDayOfWeek(Number($saDH[3][0]), Number($saDH[2][0]), Number($saDH[1][0])), 0, 1)
; Trimestre
If StringInStr($sRetour, "T") > 0 Then
Switch $saDH[2][0]
Case 1 To 3
$j = 1
Case 4 To 6
$j = 2
Case 7 To 9
$j = 3
Case 10 To 12
$j = 4
Case Else
$j = ""
EndSwitch
$sRetour = StringReplace($sRetour, "T", $j, 0, 1)
EndIf
; Semestre
If $saDH[2][0] = $j > 6 Then
$sRetour = StringReplace($sRetour, "S", "1", 0, 1)
Else
$sRetour = StringReplace($sRetour, "S", "2", 0, 1)
EndIf
; N° de semaine
If StringInStr($sRetour, "N") > 0 Then $sRetour = StringReplace($sRetour, "N", _WeekNumberISO($saDH[3][0], $saDH[2][0], $saDH[1][0]), 0, 1)
EndIf
If ($iNbD > 0) And ($iNbH > 0) And ($saDH[3][1] <> " ") Then Return "La date et l'heure doivent être séparées par un espace !"
; Partie Heure
If $iNbH = 0 Then
If StringInStr($sRetour, "h", 1) Or StringInStr($sRetour, "m", 1) Or StringInStr($sRetour, "s", 1) Then Return "L'heure doit être renseignée !"
Else
If $iNbD > 0 Then $iDelta = 3
If ($saDH[3 + $iDelta][0] = "") And ($iNbH <> 1) Then Return "L'heure doit être sous la forme hh:mm !"
If ($saDH[3 + $iDelta][0] <> "") And ($iNbH <> 2) Then Return "L'heure doit être sous la forme hh:mm:ss !"
; Heure
If Not StringIsDigit($saDH[1 + $iDelta][0]) Then Return "L'heure doit être numérique !"
If StringInStr($scH, $saDH[1 + $iDelta][1]) = 0 Then Return "L'heure et les minutes doivent être séparées par un : ou un h !"
If Number($saDH[1 + $iDelta][0]) > 23 Then Return "L'heure doit être inférieure à 24 !"
$sRetour = StringReplace($sRetour, "hh", StringRight("0" & $saDH[1 + $iDelta][0], 2), 0, 1)
$sRetour = StringReplace($sRetour, "h", Number($saDH[1 + $iDelta][0]), 0, 1)
; Minute
If Not StringIsDigit($saDH[2 + $iDelta][0]) Then Return "Les minutes doivent être numériques !"
If Number($saDH[2 + $iDelta][0]) > 59 Then Return "Les minutes doivent être inférieures à 60 !"
$sRetour = StringReplace($sRetour, "mm", StringRight("0" & $saDH[2 + $iDelta][0], 2), 0, 1)
$sRetour = StringReplace($sRetour, "m", Number($saDH[2 + $iDelta][0]), 0, 1)
; Seconde
If $saDH[3 + $iDelta][0] = "" Then
If StringInStr($sRetour, "s", 1) Then Return "Les secondes doivent être renseignées !"
Else
If $saDH[2 + $iDelta][1] <> ":" Then Return "Les minutes et les secondes doivent être séparées par un : !"
If Not StringIsDigit($saDH[3 + $iDelta][0]) Then Return "Les secondes doivent être numériques !"
If Number($saDH[3 + $iDelta][0]) > 59 Then Return "Les secondes doivent être inférieures à 60 !"
$sRetour = StringReplace($sRetour, "ss", StringRight("0" & $saDH[3 + $iDelta][0], 2), 0, 1)
$sRetour = StringReplace($sRetour, "s", Number($saDH[3 + $iDelta][0]), 0, 1)
EndIf
EndIf
; Le remplacement du mois puis du jour doit se faire en dernier
If $iNbD > 0 Then
; mois
$i = StringInStr($saMois[$saDH[2][0]], "|", 0, 2)
$j = StringInStr($saMois[$saDH[2][0]], "|", 0, 3)
$sRetour = StringReplace($sRetour, "MMMM", StringMid($saMois[$saDH[2][0]], 2, $i -2), 0, 1)
$sRetour = StringReplace($sRetour, "MMM", StringMid($saMois[$saDH[2][0]], $i +1, $j - $i -1), 0, 1)
$sRetour = StringReplace($sRetour, "MM", StringRight("0" & $saDH[2][0], 2), 0, 1)
$sRetour = StringReplace($sRetour, "M", Number($saDH[2][0]), 0, 1)
; jour
If StringInStr($sRetour, Chr(15)) > 0 Then
For $i = 1 To 7
If StringInStr($sRetour, Chr(15) & $i) > 0 Then
$sRetour = StringReplace($sRetour, Chr(15) & $i, StringMid($sajour[$i], 2, StringInStr($sajour[$i], "|", 0, 2) -2))
ExitLoop
EndIf
Next
EndIf
If StringInStr($sRetour, Chr(14)) > 0 Then
For $i = 1 To 7
If StringInStr($sRetour, Chr(14) & $i) > 0 Then
$j = StringInStr($sajour[$i], "|", 0, 2)
$sRetour = StringReplace($sRetour, Chr(14) & $i, StringMid($sajour[$i], $j +1, StringInStr($sajour[$i], "|", 0, 3) - $j -1))
ExitLoop
EndIf
Next
EndIf
EndIf
; Remettre les ~x
$sRetour = StringReplace($sRetour, Chr(1), "A")
$sRetour = StringReplace($sRetour, Chr(2), "M")
$sRetour = StringReplace($sRetour, Chr(3), "J")
$sRetour = StringReplace($sRetour, Chr(4), "h")
$sRetour = StringReplace($sRetour, Chr(5), "m")
$sRetour = StringReplace($sRetour, Chr(6), "s")
$sRetour = StringReplace($sRetour, Chr(7), "T")
$sRetour = StringReplace($sRetour, Chr(8), "S")
$sRetour = StringReplace($sRetour, Chr(9), "N")
$sRetour = StringReplace($sRetour, Chr(10), "j")
; Sortie positive
Return $sRetour
EndFunc