2010-11-01 5 views
1

J'ai récemment eu des problèmes avec la conversion de date. Certains postes de travail sur lesquels mon application s'exécute ne convertissent pas la chaîne correctement.Quel est le format de date utilisé par VarToDateTime (VarDateFromStr)?

J'ai suivi le problème jusqu'à VarDateFromStr qui ne semble pas vérifier LOCALE_SSHORTDATE pour effectuer la conversion. Je me demandais si quelqu'un savait ce qu'il a vérifié pour la conversion. Ou est-ce que le comportement différent n'est lié qu'à une version différente de DLL?

GetLocaleStr(GetThreadLocale, LOCALE_SSHORTDATE, 'm/d/yy'); // returns 'dd-MM-yyyy' 
FormatDateTime('dd-MM-yyyy', VarToDateTime('05-11-2010')); //returns '11-05-2010' 

EDIT: On m'a dit que le changement de format de date courte (dans le panneau de commande) de 'dd-MM-AAAA' pour tout et retour à 'dd-MM-AAAA' fixe le problème. Je dois encore vérifier cela.

EDIT2: Kindda a oublié de mentionner que le problème n'a été confirmé que sur WinXP SP3.

Répondre

3

Ken, la fonction VarToDateTime appelle en interne la fonction VarDateFromStr qui utilise la constante VAR_LOCALE_USER_DEFAULT pour formater la date.

pour déterminer le format Wich contient le VAR_LOCALE_USER_DEFAULT vous pouvez utiliser ce code

var 
FormatSettings  : TFormatSettings; 
begin 
     GetLocaleFormatSettings(VAR_LOCALE_USER_DEFAULT, formatSettings); 
     ShowMessage('VarToDateTime is using this format to convert dates '+formatSettings.ShortDateFormat); 
end; 

maintenant pour éviter votre problème, vous pouvez convertir votre valeur variant en chaîne, puis à datetime en utilisant la fonction StrToDateTime

var 
v     : variant; 
FormatSettings  : TFormatSettings; 
Begin 
     v:='05-11-2010';//this is your variant. 
     FormatSettings.ShortDateFormat:='dd-mm-yyyy';//use this format in the conversion 
     ShowMessage(FormatDateTime('dd-MM-yyyy', StrToDateTime(V,FormatSettings))); 
end; 
+1

Je vais juste ajouter à cela depuis que je suis tombé dessus. Veillez à définir également le caractère séparateur de date. Sinon, vous tomberez aux Pays-Bas et dans d'autres pays. – mj2008

+0

mj2008, bon point. – RRUZ

+0

Eh bien, ShortDateFormat de VAR_LOCALE_USER_DEFAULT est aussi 'jj-MM-aaaa'. Et les problèmes ne viennent pas * seulement * de mon code, mais de DevExpress, TClientDataset, InfoPower ... –

Questions connexes