Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 我如何在日期的末尾加上序号后缀?_Delphi_Date_Formatdatetime - Fatal编程技术网

Delphi 我如何在日期的末尾加上序号后缀?

Delphi 我如何在日期的末尾加上序号后缀?,delphi,date,formatdatetime,Delphi,Date,Formatdatetime,我使用的是Delphi BDS2006如何将日期(2011年10月1日)格式化为 2011年10月1日 我试着用 ShowMessage(FormatDateTime('ddd-mmm-yyyy',now)) 我收到的信息是2011年10月10日星期六 ddd给我Sat而不是1st 类似的方式,我想在日期中添加st、nd、rd、th 是否有内置的程序或函数来执行此操作,或者我必须手动检查日期并为其指定后缀 我现在正在用这个 case dayof(now)mod 10 of 1 : days:=

我使用的是Delphi BDS2006如何将日期(2011年10月1日)格式化为
2011年10月1日

我试着用
ShowMessage(FormatDateTime('ddd-mmm-yyyy',now))

我收到的信息是2011年10月10日星期六

ddd
给我
Sat
而不是
1st

类似的方式,我想在日期中添加
st、nd、rd、th

是否有内置的程序或函数来执行此操作,或者我必须手动检查日期并为其指定后缀

我现在正在用这个

case dayof(now)mod 10 of
 1 : days:=inttostr(dayof(dob))+'st';
 2 : days:=inttostr(dayof(dob))+'nd';
 3 : days:=inttostr(dayof(dob))+'rd';
 else days:=inttostr(dayof(dob))+'th';

 end;

Delphi没有任何内置功能来完成这种形式的工作。你得自己做。像这样:

function DayStr(const Day: Word): string;
begin
  case Day of
  1,21,31:
    Result := 'st';  
  2,22:
    Result := 'nd';  
  3,23:
    Result := 'rd';  
  else
    Result := 'th';  
  end;
  Result := IntToStr(Day)+Result;
end;

这是与地区无关的英文版本。GetShortMonth之所以存在,是因为它从区域设置中获取月份缩写

function GetOrdinalSuffix(const Value: Integer): string;
begin
  case Value of
    1, 21, 31: Result := 'st';
    2, 22: Result := 'nd';
    3, 23: Result := 'rd';
  else
    Result := 'th';
  end;
end;

function GetShortMonth(const Value: Integer): string;
begin
  case Value of
    1: Result := 'Jan';
    2: Result := 'Feb';
    3: Result := 'Mar';
    4: Result := 'Apr';
    5: Result := 'May';
    6: Result := 'Jun';
    7: Result := 'Jul';
    8: Result := 'Aug';
    9: Result := 'Sep';
    10: Result := 'Oct';
    11: Result := 'Nov';
    12: Result := 'Dec';
  end;
end;

procedure TForm1.DateTimePicker1Change(Sender: TObject);
var
  Day: Word;
  Month: Word;
  Year: Word;
begin
  DecodeDate(DateTimePicker1.Date, Year, Month, Day);
  ShowMessage(Format('%d%s %s %d', [Day, GetOrdinalSuffix(Day), GetShortMonth(Month), Year]));
end;

你的思路是对的,但是你在11和12的时候弄错了。这需要特殊的大小写。明白了,应该是11和12,而不是11和12。我知道这只是演示代码,但计算表达式并存储它们比重复大型子表达式要好得多。一次,写入
dayStr:=inttostr(dayof(dob))
,然后在案例中重复使用
dayStr
,而不是重复
inttostr(dayof(dob))
。这并不能提高性能,因为其中只有一种情况实际上得到了执行,但这是值得的,因为DRY原则(不要重复自己)导致了可读性更高、可维护性更强的代码和更少的错误。