2011-03-31 109 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