50分求一个日期计算天数的问题(50分)

  • 主题发起人 主题发起人 八戒儿
  • 开始时间 开始时间

八戒儿

Unregistered / Unconfirmed
GUEST, unregistred user!
用trunc得出两个日期间相差的天数,会默认的带有大小月,有的是31天有的30天,我想让他每月都是30天应该怎么做?谢谢
 
不理解。你意思5月30日与6月1日相差仅一天?那2月28日与3月1日相差几天呢?
 
不是的,我的意思是说满月的话就按照30天计算。比如
2月26到3月26那么就是30天,不论每个月有多少天
 
如果不是满月就按实有的天数计算,比如2月28到3月1日。那就是1天
 
可不可以这样,
先用dayofthemonth判断两者是不是相等,
如果相等
就用monthspan得到月份的间隔,round(monthspan(datetime1,datetime2))*30返回天数
如果不等
就用daysbetween(datetime1,datetime2)返回实际的天数

不过你要注意用daysbetween的时候,时间也会产生影响的,而不仅仅是日期,稳妥的话,最好格式化.
 
能不能麻烦您贴个代码出来?
我是新手,对这个还不是很明白,谢谢
 
意思就是满月的按照每月30天计算,不是满月的按照实际天数
 
还是没说清楚。如果跨好几个月甚至几年,你是想一个月一个月地逐月判断吗?
 
一整年按照360天算,一整月按30天,,其它的按实际的天数
 
可以这样吗?
先用MonthOfTheYear函数取得要判断的两个时间的月数:
如Monstart:=MonthOfTheYear(时间1);
Monend:=MonthOfTheYear(时间2);
如果 Monend>Monstart
则判断下面
先用dayofthemonth函数取得要判断的两个时间的天数:
如daystart:=dayofthemonth(时间1);
dayend:=dayofthemonth(时间2);
如果daystart=dayend 则:
然后实际的天数=(Monend-Monstart)*30
如过是当月的两个时间则可以直接相减就OK了
注:要把DateUtils单元加到使用上面那些函数的单元
 
会的朋友麻烦贴上完整代码并附上说明,,谢谢了,,月底前就要用的,感谢大家
 
TDateTime 其实是double型,将两个日期相减就OK了,你怎么这么笨啊!!!
 
大家也教教我,我有1234分赠送!!!!!!
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, dateutils, ComCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
dd1: TDateTimePicker;
dd2: TDateTimePicker;
Memo1: TMemo;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
function daydis(A, B: TDateTime): integer;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

function TForm1.daydis(A, B: TDateTime): integer;
//计算原理就是求出(相差的月份*30+相差的天数)
var
t1, t2: Tdate; //判断AB中的小日期给T1,大日期给T2
ydis, mdis, ddis: integer; //年份差,月份差,日差
y1, y2, m1, m2, d1, d2: integer;
//y1,m1,d1表示t1的年月日;y2,m2,d2表示t2的年月日;
begin
if A < B then
begin
t1 := A;
t2 := B
end
else
begin
t1 := B;
t2 := A;
end;
y1 := yearof(t1);
y2 := yearof(t2);
m1 := monthof(t1);
m2 := monthof(t2);
d1 := DayOfTheMonth(t1);
d2 := DayOfTheMonth(t2);
ydis := y2 - y1;
mdis := m2 - m1;
if ydis = 0 then //判断是否同年
begin
if d2 >= d1 then
ddis := d2 - d1
else
begin
mdis := mdis - 1;
ddis := d2 - d1 +DaysInMonth(t1);
end;
end
else
begin
mdis:=12*ydis+m2-m1-1;
{求出t1,t2之间相差的正月数,比如2005-05-06和2006-04-06,之间完整的月有10个.
其中不包括t1的那个月和t2的那个月}
if d2>=d1 then //如果t2的日期大于t1的日期,说明还要多一个月,
begin
mdis:=mdis+1;
ddis:=d2-d1;
end
else
begin
ddis:=d2 - d1 +DaysInMonth(t1);
end;
end;
result := 30 * mdis + ddis; //计算时间差
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
memo1.Lines.Add(datetostr(dd1.Date)+' '+datetostr(dd1.Date));
memo1.Lines.Add('时间间隔:'+inttostr(daydis(dd1.Date,dd2.Date)));
memo1.Lines.Add('------------------------------------');
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
memo1.Lines.Clear;
end;
end.

这个函数大致按照你的意思写的,你试试看符合对不对
2004-2-29 2005-2-28
358
------------------------------------
2004-2-29 2005-3-1
361
 
谢谢您啦,我试试去,另外能不能说说
function TForm1.daydis(A, B: TDateTime): integer;
这句加在这里是什么意思啊
 
后退
顶部