2011-02-26 89 views
1

我会找到两次之间的差异,但我没有得到我想要的! 我有2个timeEdit组件的形式 这里是我的代码:时差似乎工作奇怪?

void __fastcall TForm1::Button1Click(TObject *Sender) 
{ 
    TTime time1=StrToTime(t1->Text); 
    TTime time2=StrToTime(t2->Text); 


    //t1->Text=time2-StrToTime("3:00"); 

    ShowMessage((time2-time1).TimeString()); 
} 

如果我设置T1 = 02:00 并设置T2 = 01:00

它显示1:00

但我预计23:00 即01:00 - 02:00应该是23:00

我在哪里错了?

回答

3

您没有考虑TTime的编码方式。 TDateTimeDouble,其中积分部分包含自1899年12月30日以来的天数,小数部分包含(此信息在C++ Builder文档中说明)中的百分比。 TTime只是TDateTime的小数部分,其整数部分被忽略。由于这种编码,对日期/时间值执行这种看似简单的数学运算通常不会产生您期望的结果类型。

02:00(2AM)表示为0.083333333333,01:00(1AM)表示为0.041666666667。您正在从凌晨1点减去凌晨2点,预计减去2小时产生下午11点(表示为0.958333333333333)。从0.041666666667减去0.083333333333产生-0.041666666667。忽略积分部分(日期),小数部分是0.0(午夜)的正值,因此-0.041666666667等于0.041666666667,即凌晨1点。

为了使您的减法正常工作,启动时间需要连接到它的正整数部分(日期),这样的结果包含正确的小数部分,例如:

void __fastcall TForm1::Button1Click(TObject *Sender) 
{ 
    TTime t = (1.0 + StrToTime("01:00")) - StrToTime("02:00"); 
    // (1.0 + 0.041666666667) - 0.083333333333 
    // = 1.041666666667 - 0.083333333333 
    // = 0.95833333333 
    ShowMessage(t.TimeString()); 
} 
+0

试图编译这段代码。 ...哎呀!发生错误[BCC32错误] Unit1.cpp(63):E2015'_fastcall操作符System :: Variant :::(const)const在c:\ program files \ embarcadero \ rad studio \ 7.0 \ include \ vcl \ sysvari之间的不明确性.h:543'和'_fastcall operator System :: Variant::-(double)const在c:\ program files \ embarcadero \ rad studio \ 7.0 \ include \ vcl \ sysvari.h:565' 完整解析器上下文 Unit1 .cpp(62):parsing:void _fastcall TForm1 :: Button1Click(System :: TObject *) – 2011-02-28 04:01:49

+0

转换为Double帮助! TTime t =(1.0 + double(StrToTime(“01:30”)) - StrToTime(“08:50”)); – 2011-02-28 04:07:08

+0

非常感谢Remy! – 2011-02-28 04:22:36