用户名:  密码:   
您当前的位置:首页 > 程序设计 >  Delphi > 

出现莫明的故障时

上次修改时间: 2024-08-18 16:45:08      来源:网络总结      作者:钢铁长陈
上一页      路径:DSD\Learn\Delphi语言\日期和时间相关\      下一页

有时出现不能给时间赋值,提示无效的值

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;