Какой формат даты использует VarToDateTime (VarDateFromStr)? - PullRequest
1 голос
/ 01 ноября 2010

В последнее время у меня были проблемы с преобразованием дат. Некоторые рабочие станции, на которых запущено мое приложение, неправильно преобразовывают строку в дату.

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

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

1 Ответ

3 голосов
/ 01 ноября 2010

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

чтобы определить, в каком формате содержится 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;
...