起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 414|回复: 11

【搞定】CompareTime函数是如何工作的?**

[复制链接]
发表于 2007-5-9 21:22:07 | 显示全部楼层 |阅读模式
tBeginTime := DateUtils.TimeOf(q1.FieldByName('StandardOnTime').AsDateTime);
tBeginTime 的值为 15:40:00
DownEndTime.Time的值为17:00:00
j := DateUtils.CompareTime(tEndTime, DateUtils.TimeOf(DownEndTime.Time));

j := DateUtils.CompareTime(SysUtils.StrToTime('15:40:00'), SysUtils.StrToTime('17:00:00'));

j的值竟然返回255?
回复

使用道具 举报

发表于 2007-5-10 09:05:38 | 显示全部楼层
Compare(a, b: Double): ShortInt
比较两个参数a b时间部分的大小,忽略掉日期部分

返回值
a> b: 1
a= b: 0
a< b: -1

你需要把j定义成shortInt类型
如果是Integer,则a<b时返回的是255
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-5-10 14:28:35 | 显示全部楼层
晕。。。。了解了。。

还有一个问题,也是关于时间的。
在界面上我有两个日期时间,比如为2007-05-05 13:00       另一个时间为2005-05-05 17:00
并没有显示出秒。
界面上我允许用户修改这两个时间,然后计算我要对这两个时间进行比较,得出他们之间的分钟差。
但是可能是由于选择的时候,这个时间本身是带秒的。。
正常这两个时间之差,我想得到240分钟。。
可是用比较函数得到的分钟一般都为239分钟,取整以后。
请问这样的问题,有什么好的解决办法?
回复 支持 反对

使用道具 举报

发表于 2007-5-10 15:19:32 | 显示全部楼层
可以把日期中的毫秒去掉,就不会影响计算结果了。
var
  intM: Int64;
  Y, DM, D, H, M, S, MS: word;
begin
  DecodeDateTime(DateTimePicker1.DateTime,Y, DM, D, H, M, S, MS);
  ShowMessage(IntToStr(MS));

  intM := MinutesBetween(EnCodeDateTime(Y, DM, D, H, M, S, 0), DateTimePicker2.DateTime);
  ShowMessage(IntToStr(intM));
end;

函数DecodeDateTime和EnCodeDateTime在Business.System.DateUtils中
回复 支持 反对

使用道具 举报

发表于 2007-5-10 15:23:38 | 显示全部楼层
是这样
回复 支持 反对

使用道具 举报

发表于 2007-5-10 15:30:59 | 显示全部楼层
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-5-10 15:43:56 | 显示全部楼层
刚才又测试了一下

tBeginTime := DateUtils.TimeOf(q1.FieldByName('StandardOnTime').AsDateTime);
tBeginTime 的值为 15:40:00
DownEndTime.Time的值为17:00:00
j := DateUtils.CompareTime(tEndTime, DateUtils.TimeOf(DownEndTime.Time));

j := DateUtils.CompareTime(SysUtils.StrToTime('15:40:00'), SysUtils.StrToTime('17:00:00'));

如果我不使用变量J。。在调试的时候使用表达式和计算得到的表达式的值为-1
但是他执行的结果却不对。
   tEndTime的时间为:15:33      DownEndTime.Time的值为17:00
      if DateUtils.CompareTime(tEndTime, DateUtils.TimeOf(DownEndTime.Time)) <= 0 then
            begin
              im1 := DateUtils.MinutesBetween(tBeginTime, tEndTime);  //应该执行这里。
            end
            else
            begin
              im1 := DateUtils.MinutesBetween(tBeginTime, DateUtils.TimeOf(DownEndTime.Time)); 却跳到这里执行。
            end;
回复 支持 反对

使用道具 举报

发表于 2007-5-10 15:49:10 | 显示全部楼层
CompareTime函数返回的是一个ShortInt类型,你的变量j是integer类型,所以-1变成的255
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-5-10 15:53:25 | 显示全部楼层
我没用变量啊。。直接用表达式返回的值与0进行比较的。
难道必须把表达式传给一个shortInt 的变量?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-5-10 17:06:52 | 显示全部楼层
顶。。。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-1-10 03:09 , Processed in 0.039554 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表