2014-04-02 247 views
2

我有下面的字符串。現在如何在C++中比較字符串日期和time_t?

std::string _valid = "2014-03-28 16:45:59"; 

int y1, M1, d1, h1, m1, s1; 
sscanf_s(_valid.c_str(), "%d-%d-%d %d:%d:%d", &y1, &M1, &d1, &h1, &m1, &s1); 

,我能得到年,月,日等...

現在,我必須確定時間是否比當前日期時間更早。

time_t now = time(NULL); 

但是,time_t總是以unix時間戳返回我的時間。

如何比較日期?

回答

2

設置爲結構tm,然後通過函數mktime生成time_t。您可以直接比較兩個time_t的值。

您還可以使用windows.h中的SYSTEMTIMEFILETIME。設置爲SYSTEMTIME,然後通過功能SystemTimeToFileTime生成FILETIME。按功能CompareFileTime比較兩個FILETIME。 計算兩個FILETIME之間的距離,我寫了跟隨醜陋的代碼:

__int64 duration = ((*(__int64 *)&ft2) - (*(__int64 *)&ft1)); 

注意SYSTEMTIME比結構TM更高的分辨率。

+0

謝謝。這非常有幫助。 –

1

我想你正在尋找mktime函數。細節在這裏http://linux.die.net/man/3/mktime,但簡而言之...

#include <time.h> 
time_t mktime(struct tm *tm); 

在結構TM在time.h中定義...

struct tm 
{ 
    int tm_sec;   /* Seconds. [0-60] (1 leap second) */ 
    int tm_min;   /* Minutes. [0-59] */ 
    int tm_hour;   /* Hours. [0-23] */ 
    int tm_mday;   /* Day.  [1-31] */ 
    int tm_mon;   /* Month. [0-11] */ 
    int tm_year;   /* Year - 1900. */ 
    int tm_wday;   /* Day of week. [0-6] */ 
    int tm_yday;   /* Days in year.[0-365] */ 
    int tm_isdst;   /* DST.  [-1/0/1]*/ 

#ifdef __USE_BSD 
    long int tm_gmtoff;  /* Seconds east of UTC. */ 
    __const char *tm_zone; /* Timezone abbreviation. */ 
#else 
    long int __tm_gmtoff;  /* Seconds east of UTC. */ 
    __const char *__tm_zone; /* Timezone abbreviation. */ 
#endif 
}; 

希望這有助於。

+0

除了使用'sscanf'外,另一種生成'struct tm'的方法是strptime函數(strftime'的反函數)。這不是標準的C,但它可以讀取更多可能的日期/時間格式。如果你的系統沒有它,那麼你可以下載一個開源版本。 –