如何比较两个小时,说哪个更晚或更早?

时间:2013-01-29 16:33:53

标签: c++ time compare

如何比较两个小时?我尝试使用下面的代码,但它给了我两次true,但它应该给falsetrue

#include <iostream>
#include <cstdlib>
#include <cmath>
using namespace std;

bool earlierEqual(int h1, int m1, int s1, int h2, int m2, int s2)
{
    if(h1 <= h2)
    {
        return true;
    }
    else
    {
        if(m1 <= m2)
        {
            return true;
        }
        else
        {
            if(s1 <= s2)
            {
                return true;
            }
            else
                return false;
        }
    }
}

bool laterEqual(int h1, int m1, int s1, int h2, int m2, int s2)
{
    if(h1 >= h2)
    {
        return true;
    }
    else
    {
        if(m1 >= m2)
        {
            return true;
        }
        else
        {
            if(s1 >= s2)
            {
                return true;
            }
            else
                return false;
        }
    }
}

int main()
{
    int h1 = 12, m1 = 4, s1 = 29;
    int h2 = 11, m2 = 12, s2 = 1;

    // false
    cout << earlierEqual(h1, m1, s1, h2, m2, s2) << "\n";
    // true
    cout << laterEqual(h1, m1, s1, h2, m2, s2) << "\n";


    return 0;
}

6 个答案:

答案 0 :(得分:3)

只有在小时数相等时才应激活else分支。否则,即使小时h1 大于小于h2,分钟的比较也将决定。您应该将代码更改为以下内容:

bool earlierEqual(int h1, int m1, int s1, int h2, int m2, int s2)
{
    if (h1 < h2)
    {
        return true;
    }
    else if (h1 == h2)
    {
        if (m1 < m2)
        {
            return true;
        }
        else if (m1 == m2)
        {
            if (s1 < s2)
            {
                return true;
            }
        }
    }

    return false;
}

答案 1 :(得分:1)

如果小时数相等,则必须检查分钟数,如果相等,则必须检查秒数。只有在条件较差的情况下,才能立即返回true。同样适用于第二个功能:只有在更大的情况下才能提前返回。

答案 2 :(得分:1)

在进行比较之前,在几秒钟内转换所有内容会更容易。

答案 3 :(得分:1)

我就是这样做的。它更易读,更不容易出错。转换为秒,然后进行比较。

#include <iostream>
#include <cstdlib>
#include <cmath>
using namespace std;

bool earlierEqual(int h1, int m1, int s1, int h2, int m2, int s2)
{
    int totalSeconds1 = getTotalSeconds(h1, m1, s1);
    int totalSeconds2 = getTotalSeconds(h2, m2, s2);

    if(totalSeconds1 <= totalSeconds2)
    {
        return true;
    }
    else
    {
        return false;
    }
}

bool laterEqual(int h1, int m1, int s1, int h2, int m2, int s2)
{
    int totalSeconds1 = getTotalSeconds(h1, m1, s1);
    int totalSeconds2 = getTotalSeconds(h2, m2, s2);

    if(totalSeconds1 >= totalSeconds2)
    {
        return true;
    }
    else
    {
        return false;
    }
}

bool getTotalSeconds(int h1, int m1, int s1)
{
   return h1 * 3600 + m1 * 60 + s1;
}

答案 4 :(得分:1)

使用std::tie

#include <tuple>
bool earlierEqual(int h1, int m1, int s1, int h2, int m2, int s2) {
  return std::tie(h1, m1, s1) <= std::tie(h2, m2, s2);
}
bool laterEqual(int h1, int m1, int s1, int h2, int m2, int s2) {
  return std::tie(h1, m1, s1) >= std::tie(h2, m2, s2);
}

答案 5 :(得分:0)

只是一个建议:您可以在一个32位整数中表示小时+分钟+秒。 (小时为0-24 - 5位,秒0-60:6位分钟0-60:6位)

一旦你有两个整数的数字,你基本上把逻辑放在这个块中(你需要位掩码来提取小时,分钟,秒)

下面的Psedocode:

bool compare(val1,val2) { 

if(h1 < h2) return true; 
if( h1 ==  h2 && m1 < m2 )  return true;
if( h1 == h2 && m1 == m2 && s1 <s2) return true;
return false  ;
}