Convertir une chaîne en date selon un format (utilisation de "culture")

0/5 (3 avis)

Snippet vu 28 547 fois - Téléchargée 39 fois

Contenu du snippet

Convertir une variable de type String contenant une date en une variable de type Date est quelque chose de simple avec la fonction CDate.
Sauf si le format de la date n'est pas en accord avec le format de l'environnement dans lequel tourne votre application.

Je m'explique :

Supposons que vous exécutiez CDate("01/02/03") dans une application
- Si l'utilisateur est en environnement "français" il obtiendra le 1ier Février 2003.
- Si l'utilisateur est en environnement "américain" il obtiendra le 2 Janvier 2003.

La fonction ci-jointe à été écrite pour enrichir CDate en lui passant le format de la date à traiter.

Dans notre exemple du "01/02/03", si nous avons "JJ/MM/AA", il faudra lui dire :
CDateFormat( "01/02/03", "dd/MM/yy" )

Dans le code, je craie un nouvel environnement de langue avec le format passé en paramètre. Là, la fonction CDate répond à mon besoin. (J'ai prie soin de sauver l'environnement pour le restaurer avant de sortir)

Ayant fait appel à Culture, il me fut simple d'étendre la fonction d'un troisième paramètre optionnel pour répondre à une conversion du type :
CDateFormat("dimarts, 1 / juliol / 2003",, "ca-ES")

Le code contient en commentaire les liens vers les pages d'aide MS pour les formats et codes de culture.

Source / Exemple :


Imports System.Globalization
Imports System.Threading

(...)

   Private Function CDateFormat(ByVal StrDate As String, _
                                 Optional ByVal Format As String = "", _
                                 Optional ByVal CultureCode As String = "") As Date
      ' Transforme une chaine de caractères contenant une date valide
      ' en une variable de type date...
      '
      ' Il faut donner le format correctement selon la norme (voir Format(...) )
      '  et/ou le code culture.
      '
      ' 
      ' Exemples :
      '           CDateFormat("21:30:59 01/07/2003", "HH:mm:ss dd/MM/yyyy")
      '              => #7/1/2003 9:30:59 PM#
      '                 ms-help://MS.VSCC/MS.MSDNVS.1036/cpref/html/frlrfsystemglobalizationdatetimeformatinfoclasstopic.htm
      '
      '           CDateFormat("1 juillet 2003",, "fr-FR")
      '        ou CDateFormat("dimarts, 1 / juliol / 2003",, "ca-ES")   (Catalan)
      '              => #7/1/2003#
      '                 ms-help://MS.VSCC/MS.MSDNVS.1036/cpref/html/frlrfsystemglobalizationcultureinfoclasstopic.htm
      '
      ' Hélas "ddMMyyyy" ne semble pas fonctionner...
      '       Si vous trouvez une parade simple merci de me la communiquer: mailto:dominique@millot.com
      '
      Dim culPreserve As CultureInfo = Thread.CurrentThread.CurrentCulture
      Dim dRetour As Date
      Try
         Dim culTmp As New CultureInfo(CultureCode)

         If Format <> "" Then
            culTmp.DateTimeFormat.ShortDatePattern = Format
            culTmp.DateTimeFormat.LongDatePattern = Format
         End If
         Thread.CurrentThread.CurrentCulture = culTmp
         dRetour = CDate(StrDate)
     Catch
      Finally
         Thread.CurrentThread.CurrentCulture = culPreserve
      End Try
      Return dRetour
   End Function

Conclusion :


Attention, tous les formats ne sont hélas pas acceptés.
Si quelqu'un trouve une astuce simple pour qu'il accepte par exemple "yyyyMMdd", qu'il me prévienne.
(Je pense qu'une solution "universelle" peut passer par l'usage de RegEx)

A+
Dom.

A voir également

Ajouter un commentaire Commentaires
bruhmar Messages postés 1 Date d'inscription samedi 26 mars 2005 Statut Membre Dernière intervention 17 décembre 2008
17 déc. 2008 à 11:45
Très bon code.
Dalida Messages postés 6728 Date d'inscription mardi 14 mai 2002 Statut Contributeur Dernière intervention 11 janvier 2016
18 avril 2006 à 12:51
salut,

je vous propose :

------------------
' format peut-être :
' d, D, f, F, g, G, t, T, u, U, m, r, s, y
' dd/MM/yyyy, etc.

Public Function ConvertDate(ByVal dateToConvert As String, ByVal format As String) As String

Try

Return Date.Parse(dateToConvert).ToString(format)

Catch
Return String.Empty
End Try

End Function

Public Function ConvertDate(ByVal dateToConvert As String, ByVal format As String, ByVal cultureName As String) As String

Try

Return Date.Parse(dateToConvert).ToString(format, New Globalization.CultureInfo(cultureName))

Catch
Return String.Empty
End Try

End Function
--------------

ce qui donne :
ConvertDate("13/03/1978", "D") ' --> lundi 13 mars 1978
ConvertDate("13/03/1978", "ddMMyyyy") ' --> 13031978
ConvertDate("13/03/1978", "D", "en-US") ' --> Monday, March 13, 1978
VBbigineure Messages postés 169 Date d'inscription vendredi 27 septembre 2002 Statut Membre Dernière intervention 27 février 2009 1
21 janv. 2004 à 12:07
je suis en proie à ce problème, si ça marche... je dresserais pour toi une stèle sous mon tapis à souris.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Du même auteur (cs_Domilo)