2017-05-05 167 views
-1

我必須計算一天中第一次出現的時間。
輸入格式類似12:48 AM。比較12小時的格式時間

這是我的比較功能。

string timeCompare(string t1, string t2) 
{ 
    if(t1[5] == 'A' && t1[6]== 'M' && t2[5]=='P') 
    { 
     return "First"; 
    } 
    else if (t2[5] == 'A' && t2[6] == 'M' && t1[5]=='P') 
    { 
     return "Second"; 
    } 
    else if (t2[5] == 'A' && t2[6] == 'M' && t1[5]=='A' && t1[6]=='M') 
    { 
     if(stoi(t1)<stoi(t2)) 
     { 
      return "First"; 
     } 
     else if(stoi(t2) == stoi(t1)) 
     { 
      if(t2[3] > t2[3]) 
      { 
       return "Second"; 
      } 
      else if(t2[3] < t1[3]) 
      { 
       return "First"; 
      } 
      else if(t2[3] == t1[3]) 
      { 
       if(t2[4] > t1[4]) 
       { 
        return "First"; 
       } 
       if(t1[4] > t2[4]) 
       { 
        return "First"; 
       } 
       else 
       { 
        return "Equal"; 
       } 
      } 
     } 
    } 
    return 0; 
} 

此代碼是通用的,並提供所有時間的正確輸出。 但是由於這段代碼非常冗長,並且包含大量的比較,無論如何我可以縮短這段代碼嗎?

+0

請正確格式化您的代碼。另請注意,有關改進*工作代碼*的問題屬於http://codereview.stackexchange.com。 –

+0

使用實際時間類型(其中包含用於比較的運算符)並保存字符串表示以僅顯示會​​更好。此外,你的字符串返回值是容易出錯的,例如返回0;最後。如果你使用字符串,至少爲「First」定義常量,等等。 –

+0

你確定這給出了「所有時間的正確輸出」嗎?兩次不同的PM時間呢?或者當只有一個時間有12個小時,他們都是AM? – Dmitri

回答

0

我想將它們轉換爲整數(分鐘數),並且比較:

#include <iostream> 
#include <string> 

using namespace std; 

int timeToInt(const string& t) { 
    int hr=stoi(t, nullptr) % 12; 
    int min=stoi(t.substr(3),nullptr); 

    int time=hr*60+min; 

    if (t.at(5)=='p' || t.at(5)=='P') { 
    time+=12*60; 
    } 
    return time; 
} 

string timeCompare(const string& t1, const string& t2){ 
    int time1=timeToInt(t1); 
    int time2=timeToInt(t2); 
    if (time1<time2) { 
    return "First"; 
    } else { 
    return "Second"; 
    } 
} 
+0

這段代碼完美適用於所有情況。謝謝! – Saad

2

如果您認爲格式總是像09:35AM而不是9:35AM,那麼下面的代碼也應該有效。請注意,第5個字符是最重要的區別,我們可以利用'A' < 'M'這一事實。如果該位置等於兩個t1t2,然後進行簡單lexographical比較應該做的事:

string timeCompare(string t1, string t2){ 
    if(t1[5] < t2[5]) 
    return "First"; 
    else if(t1[5] > t2[5]) 
    return "Second"; 
    else 
    return (t1 < t2) ? "First" : "Second"; 
} 

如果你改變你的函數的簽名,返回一個布爾值,那麼代碼可能會更短寫成如下:

bool time1LessThanTime2(string t1, string t2){ 
    return (t1[5] == t2[5]) ? (t1 < t2) : (t1[5] < t2[5]); 
} 
+0

那「12:00 AM」和「01:00 AM」呢? – Dmitri

+0

此外,這並不代表原始代碼中的「等於」情況。 – Dmitri

0

對於這種變薄使用standa RD庫:

std::time_t stringToTimeT(const string& s1) 
{ 
    struct std::tm tm {}; 
    static const auto timeFormat = "%I:%M%p"; 
    if ((std::istringstream(s1) >> std::get_time(&tm, timeFormat)).eof()) 
    { 
     return mktime(&tm); 
    } 
    throw std::logic_error("Failed to parse time: "s + s1); 
} 

double diffTimeFromStrings(const string& s1, const string& s2) 
{ 
    return difftime(stringToTimeT(s1), stringToTimeT(s2)); 
} 

免責聲明:我做了一些測試,事實證明,「%P」不作爲documented工作。所有其他格式參數工作正常。 這是一個example

相關問題