Format Date et Culture

Signaler
Messages postés
206
Date d'inscription
samedi 17 janvier 2009
Statut
Membre
Dernière intervention
5 mars 2013
-
Messages postés
206
Date d'inscription
samedi 17 janvier 2009
Statut
Membre
Dernière intervention
5 mars 2013
-
Bonjour,

Je coince sur un probleme depuis un moment et je ne sais pas par quel bout m'y prendre.

J'ai une base sqlCE avec des donnees (tout en String): une donnee 'dBirthday' est une date avec le format dd/MM/yyyy (sauvee comme String, en fait 'nvarchar' (je n'utilise pas 'datetime')).
J'utilise un DataGridView pour afficher certaines donnees, la colonne dBirthday s'affiche correctement (avec le bon format) dans mon DataGridView.
Ce DataGridView est relie via DataBinding a des TextBoxes, mais surtout a un DateTimePicker (pour la donnee dBirthday).

DONC, lorsque j'utilise la culture fr(FR), fr(BE), fr(LU), fr(MO)[Format dd/MM/yyyy] ou fr(CA)[Format yyyy-MM-dd], je n'ai pas de probleme.
MAIS, lorsque j'utilise fr(CH)[Format dd.MM.yyyy], le 3 janvier apparait dans mon DateTimePicker comme 1 Mars.

J'ai cherche des alternatives pour resoudre eventuellement ce probleme:
- Sauver la date comme DateTime (ce qu'on m'a deja conseille), mais cela me cree des problemes supplementaires que je n'arrive pas bien a gerer, entre autre un BindingSource.Filter qui marche avec des Strings. Mais si c'est la meilleure facon??? ... a voir ...
- CultureInfo.InvariantCulture... pour sauver la date???
- DateTime.ParseExact(str, "dd/MM/yyyy", New CultureInfo(xLang)): je peine a adapter l'exemple MSDN a mon probleme et je ne suis pas sur d'etre sur la bonne voie???

En fait, je voudrais savoir dans quelle direction me diriger, car actuellement, j'essaye un peu tout et n'importe quoi.

Une question, peut-etre un peu plus globale, serait de savoir comment gerer une Date avec differentes Cultures (Un exemple MSDN ou autre serait le bienvenu).

A l'heure actuelle, la seule facon de resoudre mes problemes serait de supprimer les languages qui m'embetent, actuellement 2 sur 19. Mais, je prefererais me coucher moins bete.

A+
JLuc01

5 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
Salut JLuc

Je serais bien incapable de te répondre sur le .Net, mais, d'expérience, mieux vaut stocker les dates sous forme de date dans ta DB ET au format US par défaut, c'est à dire mm/dd/yyyy. Ceci permet de rester standard et de permettre l'utilisation des fonctions SQL comme :
... Where monChampDate Between #12/25/2005# And #01/15/2006#
Pour personnaliser l'affichage, il te suffit de créer 2 fonctions :
- Date US vers Locale
- Date Locale vers US
et d'y faire appel dès que tu as besoin d'afficher une donnée issue de la DB ou de stocker une donnée dans la DB.

Je ne sais pas quel genre de données tu manipules, mais pense aussi aux décalages horaires été/hiver : Dans ta DB, stockes tes dates et heures au format UTC (heure universelle) et, là aussi, créé 2 fonctions pour corriger ces heures :
- Date UTC vers Locale, pour l'affichage de données issues de la DB
- Date Locale vers UTC, pour stocker une donnée dans la DB

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
206
Date d'inscription
samedi 17 janvier 2009
Statut
Membre
Dernière intervention
5 mars 2013
1
Salut Jack,

Merci pour ces eclaircissement.
OK, je dois donc imperativement sauver mes dates dans une base de donnee en format Date ou DateTime.

En format US par default? Je n'en vois pas tres bien l'utilite: si je sauve la date en GB (dd/MM/yyyy) ou en US (MM/dd/yyyy), je retrouve les dates dans ma base de donnee sqlCE en GB ou en US en fonction de la Culture utilisee, c'est automatiquement mis a jour.

Mon probleme actuel (apres avoir changer le type en DateTime) est de filtrer la date.
Par exemple:
Dim search As Date = mcCalendar.SelectionStart
ContactsBindingSource.Filter = "dBirthday LIKE '" + Format(search, "dd/MM") + "%'"

Ce code marche tres bien si la variable dBirthday est declaree comme String (dd/MM/yyyy), mais ne marche pas si elle est declaree comme DateTime.
Evident! La fonction Filter filtre deux Strings.

Donc, si je veux utiliser le filtre, la date dBirthday doit etre converti en String. J'ai essaye les fonctions CONVERT et DATEPART sans succes. Je dois surement m'y prendre de travers ou bien tout melanger.

Par exemple, cela ne marche pas:
ContactsBindingSource.Filter = "CONVERT(datetime, dBirthday, 103) LIKE '" + Format(search, "dd/MM") + "%'"


Pour info, je manipule uniquement des dates (pas les heures),et je ne pense pas avoir besoin du format UTC.
Merci pour ton aide.

A+
JLuc01
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
Salut

Il faut utiliser les fonctions disponibles pour isoler le jour et le mois.
Sans avoir vérifier, je pense que ceci devrait fonctionner :
ContactsBindingSource.Filter "Day(dBirthday) 12 And Month(dBirthday) = 5


Nota : Pense aussi que les dates s'encadrent avec des #, pas des ' (réservé aux chaines)
Messages postés
206
Date d'inscription
samedi 17 janvier 2009
Statut
Membre
Dernière intervention
5 mars 2013
1
Bonsoir,

D'accord, mais les fonctions DAY et MONTH ne sont pas disponible en SQL CE.
C'est pourquoi, j'ai essaye avec CONVERT ou DATEPART => Voir ici...

Par exemple, en considerant que le mois:
Dim search As Date = mcCalendar.SelectionStart
ContactsBindingSource.Filter = "DATEPART(month, dBirthday) LIKE '" + Format(search, "MM") + "%'"

L'erreur: The expression contains undefined function call DATEPART().
Bref, je n'y comprends plus rien???

A+
JLuc01
Messages postés
206
Date d'inscription
samedi 17 janvier 2009
Statut
Membre
Dernière intervention
5 mars 2013
1
Bon, je crois que je vais abandonner cette direction.
Je n'arrive vraiment pas a trouver la bonne syntaxe.

Pour info, le dernier code essaye ci-dessous ne me donne aucune erreur, mais cela ne filtre pas:
Dim search As Date = mcCalendar.SelectionStart
ContactsBindingSource.Filter = "CONVERT(dBirthday, 'System.String') LIKE '" + Format(search, "dd/MM") + "%'"


A+
JLuc01