时间差似乎工作奇怪?

时间:2011-02-26 05:39:30

标签: datetime time c++builder

我将找到两次之间的差异,但我没有得到我想要的! 我在表单中有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

我错了?

1 个答案:

答案 0 :(得分:3)

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

02:00(2 AM)表示为0.08333333333301:00(1 AM)表示为0.041666666667。你从凌晨1点减去凌晨2点,期望它减去2小时产生11点(表示为0.958333333333333)。从0.083333333333中减去0.041666666667会产生-0.041666666667。忽略积分部分(日期),小数部分是0.0(午夜)的正值,因此-0.0416666666670.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());
}