2011-03-31 112 views
2

是否有任何系統定義函數來比較C/C++中的兩個日期?如何比較C/C++中的日期範圍?

感謝

+2

C或C++?另外,日期的格式是什麼? – EboMike 2011-03-31 04:42:07

+0

你代表日期?如果您使用簡單的「自時代以來的秒數」,您可以使用簡單的數學比較。 – yan 2011-03-31 04:42:21

+0

格式:DD/MM/YYYY – karthik 2011-03-31 04:44:51

回答

3
  1. 轉換日期(你挑格式)秒,因爲時代的開始。使用strptime和mktime。
  2. 比較兩個time_t(秒)值。 例如使用MON-DD-YYYY格式:

CODE:

#include <time.h> 
time_t to_seconds(const char *date) 
{ 
    struct tm storage={0,0,0,0,0,0,0,0,0}; 
    char *p=NULL; 
    time_t retval=0; 

    p=(char *)strptime(date,"%d-%b-%Y",&storage); 
    if(p==NULL) 
    { 
      retval=0; 
    } 
    else 
    { 
      retval=mktime(&storage); 
    } 
    return retval; 
} 

int main() 
{ 
    char *date1="20-JUN-2006"; 
    char *date2="21-JUN-2006"; 
    time_t d1=to_seconds(date1); 
    time_t d2=to_seconds(date2); 

    printf("date comparison: %s %s ",date1,date2); 
    if(d1==d2) printf("equal\n"); 
    if(d2>d1) printf("second date is later\n"); 
    if(d2<d1) printf("seocnd date is earlier\n"); 
return 0; 
} 
2

由博·佩爾鬆的評論的啓發:

bool compare_DD_MM_YYYY_dates(std::string date1, std::string date2) 
{ 
    assert(date1.size()>=10); assert(date2.size()>=10); 
    // ISO-fy dates 
    date1 = date1.substr(6,4) + date1.substr(3,2) + date1.substr(0,2) + date1.substr(10); 
    date2 = date2.substr(6,4) + date2.substr(3,2) + date2.substr(0,2) + date2.substr(10); 
    return date1 < date2; 
} 

如果不夠快,不串聯的子串,但直接比較它們。

6

這是我最喜歡的約會類(僅限於C++,不C):

http://howardhinnant.github.io/date.html

有了這個,你可以寫這樣的程序:

#include "date.h" 
#include <cassert> 

int main() 
{ 
    using namespace gregorian; 
    date d1 = thu[last]/mar/2011; // last Thursday in March 2011 
    date d2 = mar/31/2011;  // March 31, 2011 
    assert(d1 == d2);   // The last Thursday in March 2011 is 3/31/2011 
    d1 += month(1);    // last Thursday in April 2011 
    assert(d1 > d2);    // d1 is later than d2 
    assert(d1 == month(4)/28/2011); // d1 is now Apr. 28, 2011 
} 

該軟件是免費使用。你甚至不用信任任何人。 1 header,1 source

更新

該軟件的最新版本是在這裏:https://howardhinnant.github.io/date/date.html

+0

這是如此美麗。恭喜!如此優雅,所以......美麗。 ;-) – Phil 2013-11-10 02:03:50

+0

@菲爾:謝謝菲爾。很高興這個圖書館對你有幫助。 C++委員會堅決並熱烈地拒絕了它。如果它對你有幫助,我已經將我的立場撤回到一小部分兼容計時器的日期算法中,任何人都可以有效地建立一個日期類。這應該允許更廣泛的受衆(包括您自己)進行更多日期API實驗。這些低級日期算法可以在這裏找到:http://home.roadrunner.com/~hinnant/date_algorithms.html。請隨意使用這些算法,但是您希望 - 公有領域。 – 2013-11-10 03:27:36

+0

昨晚我遇到這個問題並發表了我的評論時,已經很晚了。我現在認爲,儘管我沒有看到這一點,但反映出我的興奮和印象如何。在工程領域看到一些能夠很好地完成工作並且不言自明的東西實屬罕見。這個解決方案完全以語義/語言正確的方式進行,這是有道理的。這是那些罕見的,製作精美的作品之一,它涵蓋了一個重要的主題:日期。鑑於我的評論確實達到了,我想祝賀你。委員會的立場是一個恥辱。謝謝。 – Phil 2013-11-10 11:59:54