2012-07-11 29 views
3

C中的strptime()函數未能檢測到無效日期。例如:2011-02-31,2011-04-31。 是否有任何其他功能或解決此問題的方法C:strptime中的驗證

+0

我正在尋找的東西,會給我一個指示,哪些部分的日期是無效的。就像strptime()如何返回指向最後解析的有效字符的指針一樣。謝謝 – 2012-07-11 08:54:22

回答

2

在使用strptime後,您可以使用mktime來標準化您的結構。上述

struct tm ltm = {0}; 
char buf[] = "2011-02-31"; 
puts(buf); 
strptime(buf, "%Y-%m-%d", &ltm); 
mktime(&ltm); 
strftime(buf, sizeof(buf), "%Y-%m-%d", &ltm); 
puts(buf); 

的例子會產生以下的輸出:

2011-02-31 
2011-03-03 

如果說之前和mktime後的字符串不匹配,那麼你就知道該輸入字符串是不是有效日期。

如果您需要知道哪個字段無效,您可以在致電mktime之前保存ltm結構的副本。然後,您可以檢查無效格式中的日期(tm_mday),月份(tm_mon)還是年份(tm_year)。對於tm_mon0是1月,而11是12月。對於tm_year,這是從1900開始的年數。請記住在驗證2月份的月份的日期時考慮閏年。

+0

嗯......那麼我必須重新進行檢查,並檢查normalize之前的日期是否與normalize之後的日期相同?它的解決方案..是的,但我正在尋找的東西,會給我一個跡象表明,日期是無效的。就像strptime()如何返回指向最後解析的有效字符的指針 – 2012-07-11 08:26:28

+0

這是實現它的一種方法。這比通過手工挖掘tm結構來查看所有字段是否正確更簡單。 – jxh 2012-07-11 08:28:06

+0

@AndyStowAway:我更新了答案,以及如何進行驗證。問候 – jxh 2012-07-11 08:40:58