2个时间怎么相减阿?(50分)

  • 主题发起人 主题发起人 gf.z
  • 开始时间 开始时间
有一种简单的方式
1.通过数据库求时间差
:结果为秒
SELECT (TO_DATE('2002-9-9 9:50:9','yyyy-mm-dd hh24:mi:ss')
-TO_DATE('2002-9-9 9:40:9','yyyy-mm-dd hh24:mi:ss'))*24*60*60
as DateMinus
FROM DUAL
 
另外一个方法比较复杂,但已经写好,只需传递起止时间便可
1.下面函数求两个日期(YYYY-MM-DD HH24:MI:SS)之间的间隔时间
:利用数学减法向前借位的原则进行日期的相减借位(只需要对"年","月",
"日"进行借位),"天"向前借位可能是:30[4, 6, 9, 11];31[1,3,5,7,8,12];
28[2,平年];29[2,润年];"月"向前借位"1"; "年"就不用借位了,因为首先要比较两个
日期的大小。
//==========================================================================
function DateTimeSubTract(StartDateTime, EndDateTime: TDateTime): string;
var
EndYear, EndMonth, EndDay, Hour, Min, Sec, MSec: Word;
StartYear, StartMonth, StartDay: Word;
DayCha, MonthCha, YearCha: integer;
begin
if EndDateTime < StartDateTime then // 比较两个日期的大小。
exit;
// 任一时间"为空"则不进行相减
if EndDateTime = 0 then
exit;
if StartDateTime = 0 then
exit;
// 拆分两个"日期"
DecodeDate(EndDateTime, EndYear, EndMonth, EndDay);
DecodeDate(StartDateTime, StartYear, StartMonth, StartDay);
//-------------------------------------------------------------------------
// 判断是否需要进行"日期"(年,月,日)的"借位"操作,如果EndDateTime的hh:mi:ss
// 小于StartDateTime的hh:mi:ss则需要进行"小时"向"天"借位24。
//------------------------------------------------------------------------
if TimeToStr(EndDateTime) >= TimeToStr(StartDateTime) then
// 不需要进行"日期"的"借位"操作
begin
;
end
else // 需要进行"日期"的"借位"操作
begin
EndDay := EndDay - 1; // 当'天'借位时
if EndDay <= 0 then // 当'月'借位时
begin
EndMonth := EndMonth - 1;
if EndMonth <= 0 then //当月借位后小于0,则将其置为上一年的12月31日
begin
EndYear := EndYear - 1;
EndMonth := 12;
EndDay := 31;
end
else //当日借位后月大于0时,需判断所借的天数
if (EndMonth in [4, 6, 9, 11]) then // if ((Month=4) or (Month=6) or
// (Month=9) or (Month=11))
EndDay := 30
else if (EndMonth = 2) then
begin //润年为能被4或(400整除但不能被100整除)
if IsLeapYear(EndYear) then
EndDay := 29
else
EndDay := 28;
end
else
EndDay := 31;
end;
end;
// 求"年","月", "日"的差
DayCha := EndDay - StartDay;
if DayCha < 0 then
begin
EndMonth := EndMonth - 1;
if EndMonth <= 0 then
begin
EndYear := EndYear - 1;
EndMonth := 12;
EndDay := EndDay + 31;
end
else //Endmonth 大于0
begin
if (EndMonth + 1 in [4, 6, 9, 11]) then
EndDay := EndDay + 30
else if (EndMonth + 1 = 2) then
begin // 润年为能被4或(400整除但不能被100整除)
if IsLeapYear(EndYear) then
EndDay := EndDay + 29
else
EndDay := EndDay + 28;
end
else
EndDay := EndDay + 31;
end;
DayCha := EndDay - StartDay + 1; // 日子不对面,对面多一天
end;

MonthCha := EndMonth - StartMonth;
if MonthCha < 0 then begin
MonthCha := EndMonth+12 - StartMonth;
EndYear := EndYear - 1;
end;
YearCha := EndYear - StartYear;
// 两个"日期"的"时间"(hh:mi:ss)可以直接相减并自动向"天"借位(24小时)
DecodeTime(EndDate - StartDate, Hour, Min, Sec, MSec);

Result := IntToStr(YearCha) + '年' + IntToStr(MonthCha) + '月' + IntToStr(DayCha) + '天' + IntToStr(Hour) + '小时' + IntToStr(Min) + '分' + IntToStr(Sec) + '秒';
end;

 

Similar threads

S
回复
0
查看
862
SUNSTONE的Delphi笔记
S
S
回复
0
查看
787
SUNSTONE的Delphi笔记
S
后退
顶部