两个日期相减怎么取得他们之间的年、月数。
我用这个
var
Form1: TForm1;
y,m,d:integer;
implementation
uses DateUtils;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
y:=0;
m:=0;
d:=0;
y:=yearsBetween(StrToDate(Edit2.Text),StrToDate(Edit1.Text));
m:=MonthsBetween(StrToDate(Edit2.Text),StrToDate(Edit1.Text));
if (y<>0)then
m:=m mod 12;
edit3.Text:=inttostr(y);
edit4.Text:=inttostr(m+1);
end;
end.
在计算1-3月份时总是出错,有没有更好一点的函数,这个太烂,不好用,或者那位大虾有自己编写的代码,可否赐教一下,谢谢!!!
我用这个
var
Form1: TForm1;
y,m,d:integer;
implementation
uses DateUtils;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
y:=0;
m:=0;
d:=0;
y:=yearsBetween(StrToDate(Edit2.Text),StrToDate(Edit1.Text));
m:=MonthsBetween(StrToDate(Edit2.Text),StrToDate(Edit1.Text));
if (y<>0)then
m:=m mod 12;
edit3.Text:=inttostr(y);
edit4.Text:=inttostr(m+1);
end;
end.
在计算1-3月份时总是出错,有没有更好一点的函数,这个太烂,不好用,或者那位大虾有自己编写的代码,可否赐教一下,谢谢!!!
解决方案 »
- access数据库如何新增图片
- ODBC的用法,通过它怎么建立连接~!~!
- [求助]delphi开发ocx的大致步骤
- 我想在canvas上显示文字我即时输入的文字,但其字符串需要const类型,请问应该怎么办呢?
- Dbgrid问题
- 请各位帮帮我!! 多层结构的 WebSnap 问题。!!谢谢!!
- 急急急!!!我自己写了两个procedure,但是第一个的其中一个参数为什么不能传递给第二个???
- 菜鸟问题6
- 请各位帮忙看一下adoquery的问题.
- 用DBGRID显示时间,只能显示到日,能不能显示到秒??
- 请教:不连接其它数据库,我怎么在程序中自定义一个数据表 datatable,以存储二维数据?,且能绑定到dbgrid
- 看看这句SQL这样写有什么毛病?简单的SQL
另外
if y>0 then
begin
m:=m mod 12;
label2.Caption:='month'+inttostr(m+1);
end
else
begin
label2.Caption:='month'+inttostr(m)
end;
label1.Caption:='year'+inttostr(y);
因为年可能是365或者366,月可能是28~31
唯一精确的就是天数delphi 提供了日期和月份差的函数,但是它是利用每月平均天数计算的,你的日期差的越多它就越准确。
begin
M := (YearOf(D2)-YearOf(D1))*12 + MonthOf(D2) - MonthOf(D1);
Y := YearOf(D2)-YearOf(D1);
end;procedure TForm1.Button1Click(Sender: TObject);//测试一下
var
D1, D2 : TDateTime;
Y , M : integer; //Y,M用来存放年、月的差
begin
D1 := VarToDateTime('2006-3-2');
D2 := VarToDateTime('2008-8-8');
YearAndMonthBetween(D1,D2,Y,M);
ShowMessage(Format('相差%d个年度。相差%d个月份。',[Y,M]));
end;
uses DateUtils;测试结果是:相差2个年度。相差29个月份。
DateUtils单元里有了...
YeasBetween()
MonthsBetween()
相减后要想精确的得到年数和月数是不现实也没意义的。
因为年可能是365或者366,月可能是28~31
唯一精确的就是天数delphi 提供了日期和月份差的函数,但是它是利用每月平均天数计算的,你的日期差的越多它就越准确。
经大虾这么一说心里立马明白了,还是本质、基础、有深度的东西容易从根本上理解问题,找到问题。但这样也就是delphi本身自带的函数是存在缺陷的了,那么有没有很好的方法来解决这个问题呢,我的程序是一个有关劳动合同的,所以必须知道合同签订人的签订期限(也就是几年几个月),还望大虾指点
1、签合同的人签定的有效期不是天数,而是到期时候的年月日,比如 今天是 2007/01/23,明年2008/01/22到期。
2、确定了时间段之后,你需要统计他们需要经历的月份数,有了月份数在 div 12 就是年数了。
// 参数:
// ABDate: 起始日期
// AEDate: 终止日期
// 返回值: 返回月份差
//**************************************
function DateMonthBetween(const ABDate, AEDate: TDateTime):integer;
var
BDate, EDate: TDateTime;
wBYear, wBMonth, wBDay: WORD;
wEYear, wEMonth, wEDay: WORD;
begin
// 保证日期顺序
if ABDate > AEDate then begin
BDate:= AEDate;
EDate:= ABDate;
end
else begin
BDate:= ABDate;
EDate:= AEDate;
end;
// 分解日期
DecodeDate(BDate, wBYear, wBMonth, wBDay);
DecodeDate(EDate, wEYear, wEMonth, wEDay); Result:= wEMonth - wBMonth + (wEYear - wBYear) * 12;
// 判断日期差是否足月,不足月份减一
if wEDay+1 < wBDay then
Dec(Result);
end;返回值月份,要得到年份用月份 div 12 就行了