

有时出现不能给时间赋值,提示无效的值
var
d1,d2:TDateTime;
begin
data1:= StrToDateTime('2023-06-20 18:37:25'); //这里赋值时提示无效的值时就可以注意下面的问题了
要注意系统的时间格式
2023/06/21 3:23:11,有时系统默认是这样
2023-06-21 03:23:11 要改成这样
方法一:
或者在程序初始化时执行如下代码
Application.Initialize; //最好放在这句后面,需要先引用windows单元
procedure TForm1.FormCreate(Sender: TObject);
begin
SetLocaleInfo(LOCALE_SYSTEM_DEFAULT,LOCALE_SSHORTDATE,'yyyy-MM-dd'); //将系统的日期格式设为以-分隔,如:1900-01-01
SetLocaleInfo(LOCALE_SYSTEM_DEFAULT,LOCALE_STIME,'HH:mm:ss');
end;
//上面这种方法要第二次运行程序才正常,第一次先把系统日期格式改了,但获取到的日期格式没变,第二次就获取就是改格式后的日期了
方法二:
不管获取到的日期是什么,先格式化为以-分隔的,如:1900-01-01
FormatDateTime('yyyy-MM-dd', dateValue)
StrToDate(FormatDateTime('yyyy-MM-dd', Date()))
//注:方法二不能解决字符转为日期赋给日期变量的问题,如果系统日期格式为2023/11/23时,不能把2023-11-23的字符串转为日期,转时出错
//注2:dstr:='2024-04-28'; date1:=StrToDate(dstr); //StrToDate应该是调用系统的API来将字串转日期的,如果系统日期为-分隔的,如:1900-01-01就可以转,如以/分隔的就不可转
方法三:使StrToDateDef函数,转换失败返回0,再判断是否为0作相应处理
var
dateString: string;
dateValue: TDateTime;
begin
dateString := '2023-11-23'; // 假设获取到的日期字符串
dateValue := StrToDateDef(dateString, 0); // 将字符串转换为日期,如果无法转换则返回默认值0
if dateValue <> 0 then
begin
// 转换成功,对日期进行操作
end
else
begin
// 转换失败,处理错误情况
// ...
end;
end;
方法四:使用TryStrToData函数,判断是否转换成功再作相应处理
var
dateString: string;
dateValue: TDateTime;
begin
dateString := '23/11/2023'; // 假设获取到的日期字符串
if TryStrToDate(dateString, dateValue) then
begin
// 转换成功,对日期进行操作
// ...
end
else
begin
// 转换失败,处理错误情况
// ...
end;
end;
方法五:
d1, d2: TDateTime;
fs: TFormatSettings;
d3: Integer;
softdate:='2024-04-06'
begin
fs.ShortDateFormat := 'yyyy-mm-dd'; //用来格式化日期
fs.DateSeparator := '-'; //用来格式化日期分隔符,
d1 := StrToDate(FormatDateTime('YYYY-MM-DD', Now), fs); //获取当前日期, FormatDateTime返回的是字符串,StrToDate用以将字符串转为指定格式日期
d2 := StrToDate(softdate, fs); //softdate为软件最后更新日期,StrToDate用以将字符串转为指定格式日期
d3 := round(d1 - d2);
end
方法6:先获取当前系统的日期分隔符是/还是-, 再用StringReplace把字符串中的分隔符替换为和系统一样就可以用StrToDate函数转将字符转为日期了
function GetDateSeparator():string;
var
SysFrset: TFormatSettings;
begin
Result:='';
GetLocaleFormatSettings(GetUserDefaultLCID, SysFrset);
Result:=SysFrset.DateSeparator; //DateSeparator当前系统日期分隔符
end;
if GetDateSeparator()='/' then
begin
lastRunDay := StringReplace(lastRunDay, '-', '/', [rfReplaceAll]);
end;