Delphi有这个功能:
function VarToDateAsString(const V: TVarData): TDateTime;
....
LResult := VarDateFromStr(S, VAR_LOCALE_USER_DEFAULT, 0, Result);
在今天的日期这样做:
VarDateFromStr('07;12;18', VAR_LOCALE_USER_DEFAULT, 0, Result);
然后结果将相等
Result = '07;18;12'
是否可以修复?
代码示例
procedure TForm1.Button1Click(Sender: TObject);
var
LDateTimeVar: Variant;
LDateTime: TDateTime;
begin
// Current date separator in OS settings is ';'
LDateTimeVar := '07;12;18';
LDateTime := VarToDateTime(LDateTimeVar);
// Expected LDateTime = '07;12;18',
// but will be LDateTime = '07;18;12'
ShowMessage(DateToStr(LDateTime));
end;
答案 0 :(得分:2)
VarToDateAsString
调用'oleaut32'VarDateFromStr
来执行转换,如果你有一年中间的话,它就会失败。
variants.VarToDateAsString
:
function VarToDateAsString(const V: TVarData): TDateTime;
var
...
begin
_VarToWStr(S, V);
LResult := VarDateFromStr(S, VAR_LOCALE_USER_DEFAULT, 0, Result);
...
在第二行放置断点,您会看到Result
参数将反转日期和年份。您可以通过致电activex.VarDateFromStr
来自行进行测试。
您可以绕过variants.VarToDateAsString
调用VarDateFromStr
并实现自己的功能,但不要考虑使用来自sysutils
的内容,因为它不支持一年 - 中间格式。 sysutils.TryStrToDateTime
拨打ScanDate
,然后拨打GetDateOrder
。以下是整个功能:
function GetDateOrder(const DateFormat: string): TDateOrder;
var
I: Integer;
begin
Result := doMDY;
I := 1;
while I <= Length(DateFormat) do
begin
case Chr(Ord(DateFormat[I]) and $DF) of
'E': Result := doYMD;
'Y': Result := doYMD;
'M': Result := doMDY;
'D': Result := doDMY;
else
Inc(I);
Continue;
end;
Exit;
end;
end;
正如你所看到的,中间没有结果排序。
看起来你必须自己解析字符串:
uses
varutils;
function MyVarDateFromStr(const strIn: WideString; LCID: DWORD; dwFlags: Longint;
out dateOut: TDateTime): HRESULT; stdcall;
begin
// write your parser here and return a valid 'dateOut'
end;
procedure TForm1.Button1Click(Sender: TObject);
var
LDateTimeVar: Variant;
LDateTime: TDateTime;
begin
varutils.VarDateFromStr := MyVarDateFromStr; // replace the broken function
// Current date separator in OS settings is ';'
LDateTimeVar := '07;12;18';
LDateTime := VarToDateTime(LDateTimeVar);
// Expected LDateTime = '07;12;18',
// but will be LDateTime = '07;18;12'
ShowMessage(DateToStr(LDateTime));
end;