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

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

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)