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

Soyez le premier à donner votre avis sur cette source.

Snippet vu 27 370 fois - Téléchargée 38 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
Messages postés
1
Date d'inscription
samedi 26 mars 2005
Statut
Membre
Dernière intervention
17 décembre 2008

Très bon code.
Messages postés
6728
Date d'inscription
mardi 14 mai 2002
Statut
Contributeur
Dernière intervention
11 janvier 2016

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
Messages postés
169
Date d'inscription
vendredi 27 septembre 2002
Statut
Membre
Dernière intervention
27 février 2009
1
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)