我正在使用 Delphi7 。
我的日期格式设置为 yyyymmdd (可以采用任何日期格式而不使用分隔符)。当我尝试StrToDate('20170901')
时,它会抛出错误。
我想支持所有有效的日期格式(可以由不同区域的不同客户端使用。)
我尝试使用VarToDateTime
,但它也无效。
如果DateToStr()也存在同样的问题,请引导我完成。
答案 0 :(得分:6)
您收到错误,因为您的输入字符串与您日期/时间字符串的机器区域设置不符。
通常情况下,我建议您使用StrToDate()
单元中的SysUtils
函数,事先设置其全局ShortDateFormat
和DateSeparator
变量,然后再恢复它们(Delphi 7)在引入TFormatSettings
记录之前,例如:
uses
..., SysUtils;
var
OldShortDateFormat: string;
OldDateSeparator: Char;
input: string;
dt: TDateTime;
begin
input := ...;
OldShortDateFormat := ShortDateFormat;
OldDateSeparator := DateSeparator;
ShortDateFormat := 'yyyymmdd'; // or whatever format you need...
DateSeparator := '/'; // or whatever you need
try
dt := StrToDate(input);
finally
ShortDateFormat := OldShortDateFormat;
DateSeparator := OldDateSeparator;
end;
// use dt as needed...
end;
不幸的是,StrToDate()
要求输入字符串在日期组件之间有一个分隔符(即2017/09/01
),但输入字符串不是(20170901
)。解析字符串时,StrToDate()
不允许DateSeparator
设置为#0
,即使ShortDateFormat
未指定任何分隔符的格式也是如此。
因此只留下一个选项 - 手动解析字符串以提取单个组件,然后使用EncodeDate()
单元中的SysUtils
函数,例如:
uses
..., SysUtils;
var
wYear, wMonth, wDay: Word;
input: string;
dt: TDateTime;
begin
input := ...;
wYear := StrToInt(Copy(input, 1, 4));
wMonth := StrToInt(Copy(input, 5, 2));
wDay := StrToInt(Copy(input, 7, 2));
// or in whatever order you need...
dt := EncodeDate(wYear, wMonth, wDay);
// use dt as needed...
end;
DateToStr()
功能也受区域设置的限制。但是,它确实允许在输出中省略DateSeparator
。所以,您可以:
使用DateToStr()
,将全局ShortDateFormat
变量设置为所需格式:
uses
..., SysUtils;
var
OldShortDateFormat: string;
dt: TDateTime;
output: string;
begin
dt := ...;
OldShortDateFormat := ShortDateFormat;
ShortDateFormat := 'yyyymmdd'; // or whatever format you need...
try
output := DateToStr(dt);
finally
ShortDateFormat := OldShortDateFormat;
end;
// use output as needed...
end;
使用TDateTime
单元中的DecodeDate()
函数从SysUtils
中提取单个日期组件,然后使用年/月/日值格式化您自己的字符串你想要的:
uses
..., SysUtils;
var
wYear, wMonth, wDay: Word;
dt: TDateTime;
output: string;
begin
dt := ...;
DecodeDate(dt, wYear, wMonth, wDay);
output := Format('%.4d%.2d%.2d', [wYear, wMonth, wDay]);
// use output as needed...
end;
答案 1 :(得分:5)
要将该字符串转换为TDateTime
,请将字符串拆分为年,月和日组件,并将其传递给EncodeDate()
函数。
var
myStr: string;
myDate: TDate;
begin
myStr := '20170901';
myDate := EncodeDate(
StrToInt(Copy(MyStr, 1, 4)),
StrToInt(Copy(MyStr, 5, 2)),
StrToInt(Copy(MyStr, 7, 2))
);
...
end;