2015-09-23 49 views
1

事情是這樣的:C++比較2個日期和檢查分差

日期時間訪問與使用C#創建DateTime.Now。此日期時間通過JSON傳遞給C++方法。我正在使用JsonCpp來處理Json數據,但我不知道如何處理數據是日期時間。

我想比較我收到的這個日期時間和實際的日期時間,並檢查這兩者之間的分鐘差異(如果差異在定義的時間間隔上)。

如果我使用JsonCpp轉換JSON的日期時間爲一個字符串我有這樣的格式:

2015-06-08T11:17:23.746389-03:00 

所以我想要做的是這樣的:

var d1 = oldAccess["Date"].ToString(); //Json datetime converted to a string 
var d2 = actualAccess["Date"].ToString() 
if((d2 - d1) < 20) { //Difference between the two dates needs to be less than 20 minutes 
    return true; 
} else return false; 

我新的C++,甚至尋找我沒有發現如何做到這一點。

+0

問題是不是很清楚你是否需要將字符串轉換爲C#中的DateTime對象? – Marco

+0

@Marco,datetime是在C#中創建的,以這種格式傳遞給Json:'2015-06-08T11:17:23.746389-03:00',比我需要在C++中進行轉換和比較 –

+0

我認爲你應該考慮使用類似Boost.Date_Time來解析表示時間戳的字符串,然後進行所需的比較。 – dschulz

回答

1

嗯,我明白了。不是最好的方式既不是漂亮的,但它的作品,因爲我知道,這兩個日期分別設置在同一臺服務器上,並總是以相同的格式\"2015-01-01T23:40:00.000000-03:00\"

這裏就是我所做的:

int convertToInt(std::string number_str){ 
    int number; 
    std::istringstream ss(number_str); 
    ss.imbue(std::locale::classic()); 
    ss >> number; 
    return number; 
} 

time_t convertDatetime(std::string date_str) { 
    time_t rawtime; 
    struct tm date; 
    int year, month, day, hour, min, sec; 

    date_str.erase(std::remove_if(date_str.begin(), date_str.end(), isspace), date_str.end()); 

    year = convertToInt(date_str.substr(1, 4)); 
    month = convertToInt(date_str.substr(6, 2)); 
    day = convertToInt(date_str.substr(9, 2)); 
    hour = convertToInt(date_str.substr(12, 2)); 
    min = convertToInt(date_str.substr(15, 2)); 
    sec = convertToInt(date_str.substr(18, 2)); 

    time(&rawtime); 
    localtime_s(&date, &rawtime); 
    date.tm_year = year - 1900; 
    date.tm_mon = month - 1; 
    date.tm_mday = day; 
    date.tm_hour = hour; 
    date.tm_min = min; 
    date.tm_sec = sec; 

    return mktime(&date); 
} 

bool isValidIntervalDatetime(std::string actualDatetime_str, std::string oldDatetime_str, int maxMinutesInterval) { 
    double maxSecondsInterval = 60 * maxMinutesInterval; 
    time_t actualDatetime = convertDatetime(actualDatetime_str); 
    time_t oldDatetime = convertDatetime(oldDatetime_str); 

    double secondsDiff = difftime(actualDatetime, oldDatetime); 

    return secondsDiff <= maxSecondsInterval; 
} 

int main(int argc, char* argv[]) 
{ 
    auto maxMinutesInterval = 20; 
    auto actuaDatetime = JsonConverter::toString(actualAccess["Date"]); // \"2015-01-02T00:00:00.000000-03:00\" 
    auto oldDatetime = JsonConverter::toString(oldAccess["Date"]); // \"2015-01-01T23:40:00.000000-03:00\" 

    if (isValidIntervalDatetime(actuaDatetime, oldDatetime, maxMinutesInterval){ 
     //do something 
    } 
}