Page 1 sur 1

changer une date de JJ/MM/AAAA à AAAA/MM/JJ

Posté : ven. 19 janv. 2018 08:14
par yohanb767
Bonjour à tous !

je ne parviens pas à trouver une fonction qui me permette de convertir une date de format JJ/MM/AAAA à AAAA/MM/JJ

je sais comment faire l'inverse avec la fonction _DateTimeFormat
mais dans le sens inverse aucune idée

Bonne journée à tous

Re: changer une date de JJ/MM/AAAA à AAAA/MM/JJ

Posté : ven. 19 janv. 2018 08:32
par Tlem
Bonjour.
Vous pourriez tout simplement utiliser StringSplit() pour décomposer votre date en trois parties, puis de remettre en forme tel que vous le désirez.

Genre :

Code : Tout sélectionner

 $date = "dd/mm/aaaa"

Local $adate = StringSplit($date, "/")
Local $sDate = $aDate[3] & "/" & $aDate[2] & "/" & $aDate[1]

MsgBox(32, "Date aaaa/mm/dd", $sDate)
Le code ci-dessous a été écrit sur le smartphone, donc il peut subsister des erreurs. ^^

Envoyé de mon appareil mobile en utilisant Tapatalk



Re: changer une date de JJ/MM/AAAA à AAAA/MM/JJ

Posté : ven. 19 janv. 2018 10:18
par yohanb767
Merci Thierry ,

je n'avais pas pensé à ça , j'étais parti plus sur une fonction plus précise
mais cela m'avance bien quand même

merci

Re: changer une date de JJ/MM/AAAA à AAAA/MM/JJ

Posté : ven. 19 janv. 2018 12:19
par Tlem
Hé bien dans ce cas, utilisez "la fonction précise" : _Convert_ddmmyyyy_To_yyyymmdd() ^^
$date = "19/01/2018"
MsgBox(32, "Date aaaa/mm/dd", _Convert_ddmmyyyy_To_yyyymmdd($Date, "/"))



Func _Convert_ddmmyyyy_To_yyyymmdd($szDate, $szSeparator="")
   Local $sdate = StringRegExpReplace($szDate, "[ /.///-]", "")
   If StringLen($sdate) <> 8 Then Return SetError (1, 0, "")

   Return StringRight($sdate, 4) & $szSeparator & StringMid($sdate, 3, 2) & $szSeparator & StringLeft($sdate, 2)
EndFunc

Et pour encore plus de "précision", la même avec un check de la date :
#include <Date.au3>

$date = "19/01/2018" ; date valide
MsgBox(32, "Date aaaa/mm/dd", _Convert_ddmmyyyy_To_yyyymmdd($Date, "/"))

$date = "19/21/2018" ; Erreur sur le mois
MsgBox(32, "Date aaaa/mm/dd", _Convert_ddmmyyyy_To_yyyymmdd($Date, "/"))

$date = "1/1/2018"  ; Erreur sur le format
MsgBox(32, "Date aaaa/mm/dd", _Convert_ddmmyyyy_To_yyyymmdd($Date, "/"))



Func _Convert_ddmmyyyy_To_yyyymmdd($szDate, $szSeparator="")
   Local $sdate = StringRegExpReplace($szDate, "[ /.///-]", "") ; Supprime les caractères de séparation de date
   If StringLen($sdate) <> 8 Then Return SetError (1, 0, $szDate & " => Date Size Error") ; Vérifie qu'on a bien 8 chiffres
   ; Vérifie la validité de la date
   If Not _DateIsValid(StringRight($sdate, 4) & "/" & StringMid($sdate, 3, 2) & "/" & StringLeft($sdate, 2)) Then Return SetError (1, 0, $szDate & " => Input Date Error")

   ; Retourne la date formatée avec le séparateur choisit.
   Return StringRight($sdate, 4) & $szSeparator & StringMid($sdate, 3, 2) & $szSeparator & StringLeft($sdate, 2)
EndFunc
J'ai volontairement simplifié la gestion des erreurs, mais l'idée est là !!!

Re: changer une date de JJ/MM/AAAA à AAAA/MM/JJ

Posté : ven. 19 janv. 2018 14:26
par mikell
Rhaalala ces gens qui lisent pas le fichier d'aide :mrgreen:
D'après l'exemple n°2 pour StringRegExpReplace

Msgbox(0,"", StringRegExpReplace("19/01/2018", '(\d{2})/(\d{2})/(\d{4})', "$3/$2/$1") )

Re: changer une date de JJ/MM/AAAA à AAAA/MM/JJ

Posté : ven. 19 janv. 2018 21:12
par Tlem
Bonsoir.

Même si cela présente peu d’intérêt et que la vitesse d’exécution du code est d'un pouillème de pouilème plus rapide (oui je sais, c'est ridicule, mais bon) voici la même chose sans utiliser les expressions régulières. ^^

Local $d="19/01/2018"
MsgBox(0, "", StringRight($d, 4) & "/" & StringMid($d, 4, 2) & "/" & StringLeft($d, 2))

Re: changer une date de JJ/MM/AAAA à AAAA/MM/JJ

Posté : ven. 19 janv. 2018 21:41
par mikell
Bin disons que l'expression régulière a l'avantage de fonctionner pour une date qui ferait partie d'une phrase, par exemple, comme dans l'exemple du fichier d'aide. C'est pas rien :mrgreen:
Maintenant à choisir, j'aime autant ton code du post n°2 (avis personnel of corse)

Re: changer une date de JJ/MM/AAAA à AAAA/MM/JJ

Posté : ven. 19 janv. 2018 22:46
par Tlem
Soit, mais en théorie, lorsque l'on souhaite faire un traitement sur une date, on évite de rajouter d'autres choses. ^^
D'autant que l'argument n'est valable que si et seulement si il n'y a pas d'autre date ou chiffre dans la chaine à traiter.

Les fonctions du message 4 ont le mérite traiter et retourner des dates avec différents séparateurs.
Cela permet de traiter une date du genre 19/01/2018 ou 19.01.2018 ou 19-01-2018 ou encore 19 01 2018 et de retourner la date sous la forme AAAAMMJJ avec ou sans séparateur de son choix.
Pour couronner le tout la deuxième fonction vérifie la validité de la date de sortie. :mrgreen:


PS: Concernant les temps de traitements, j'ai rayé mon commentaire qui est faux. De toute façon, a moins de faire des millions de traitements en boucle, l'écart est tellement infime qu'en parler était ridicule de ma part. :oops:

Re: changer une date de JJ/MM/AAAA à AAAA/MM/JJ

Posté : ven. 19 janv. 2018 23:00
par orax
Tlem a écrit :Les fonctions du message 4 ont le mérite traiter et retourner des dates avec différents séparateurs.
Avec StringRegExpReplace, on pourrait faire...

Code : Tout sélectionner

MsgBox(0, "", StringRegExpReplace("19-01-2018", '(\d{2})(.?)(\d{2})(.?)(\d{4})', "$5$2$3$4$1"))

Re: changer une date de JJ/MM/AAAA à AAAA/MM/JJ

Posté : sam. 20 janv. 2018 09:59
par Tlem
Heuuu, oui mais non !
Dans l'exemple que tu donne, tu récupère le séparateur de l'input que tu réutilise sur l'output !!! C'est pas vraiment ça le but. ^^
Bon après il faut peu de changement pour adapter, mais ce ne sera pas sur une seule ligne.
Et puis, il n'y a pas de gestion d'erreur et pas de contrôle sur la validité de la date. :P