2010-11-01 9 views
1

В последнее время у меня проблемы с преобразованием даты. Некоторые рабочие станции, на которых работает мое приложение, не корректно конвертируют строку в дату.Какой формат даты используется VarToDateTime (VarDateFromStr)?

Я отследил проблему до VarDateFromStr, которая, похоже, не проверяет LOCALE_SSHORTDATE, чтобы сделать преобразование. Мне было интересно, знает ли кто-нибудь, что он проверял на конверсию. Или другое поведение связано только с другой версией 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: Я сказал, что изменение формата короткие даты (в панели управления) от «ДД-ММ-ГГГГ», чтобы независимо и обратно «ДД-ММ-ГГГГ» фиксированной проблема. Я все еще должен это проверить.

EDIT2: Kindda забыл упомянуть, проблема была подтверждена только на WinXP SP3.

ответ

3

Ken, VarToDateTime Функция внутренне вызывает функцию VarDateFromStr, использующую константу VAR_LOCALE_USER_DEFAULT для форматирования даты.

определить формат Wich содержит VAR_LOCALE_USER_DEFAULT вы можете использовать этот код

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

сейчас, чтобы избежать вашей проблемы, вы можете преобразовать ваш вариант значения в строку, а затем DateTime с помощью функции 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

Я просто добавлю к этому, так как я упал на него. Обязательно также задайте символ разделителя даты. В противном случае вы попадете в Нидерланды и в другие страны. – mj2008

+0

mj2008, хорошая точка. – RRUZ

+0

Ну, ShortDateFormat VAR_LOCALE_USER_DEFAULT также является «dd-MM-yyyy». И проблемы не * только *, исходящие из моего кода, но из DevExpress, TClientDataset, InfoPower ... –

Смежные вопросы