簡體   English   中英

使用有效日期功能 <ctime> mktime

[英]Valid Date function using <ctime> mktime

我想要一個功能,它需要三天,一個月,一年的輸入,並告訴我它是否有效。 然后使用http://www.cplusplus.com/reference/ctime/mktime/上的示例

我試圖實現我的功能:

bool ValidDate(int d, int m, int y)
{
struct tm *timeinfo;
time_t rawtime;
time (&rawtime);
timeinfo = localtime(&rawtime);
timeinfo->tm_year = y - 1900;
timeinfo->tm_mon = m - 1;
timeinfo->tm_mday = d;

if (mktime(timeinfo) == -1 )
    return false;
else return true;
}

問題是函數返回的不是我想要的。 例如我正在檢查

if (ValidDate(4,13,2010)) // out put is valid
    std::cout << "valid\n";
else std::cout << "Invalid\n";

ValidDate(4,22,2010) // valid
ValidDate(344,13,2010) //valid
ValidDate(4,133,2010) //valid
ValidDate(31,12, 1920) //invalid
ValidDate(31,9,2010) //valid
ValidDate(4,9,2010) //valid

為什么? 謝謝。 編輯:除31,12,1920和4,9,2010外,所有輸入的日期均無效,且非輸出均正確。

mktime返回如下:

從epoch開始的時間作為成功時的std::time_t對象,如果時間不能表示為std::time_t對象,則為-1

std::time_t定義如下:

能夠表示時間的算術類型。

雖然未定義,但這幾乎總是一個整數值,保持自00:00, Jan 1 1970 UTC 時間 00:00, Jan 1 1970 UTC起的秒數(不計算閏秒),對應於POSIX時間

所以31/12/1920不能表示為std::time_t因為它在紀元之前。


至於報告為有效的其他無效日期, mktime還聲明:

[參數]中的值允許超出其正常范圍。

以下是從cppreference中獲取的示例:

#include <iostream>
#include <iomanip>
#include <ctime>

int main()
{
    std::time_t t = std::time(NULL);
    std::tm tm = *std::localtime(&t);
    std::cout << "Today is           " << std::put_time(&tm, "%c %Z") <<'\n';
    tm.tm_mon -= 100;  // tm_mon is now outside its normal range
    std::mktime(&tm);
    std::cout << "100 months ago was " << std::put_time(&tm, "%c %Z") << '\n';
}

輸出是:

Today is Wed Dec 28 09:56:10 2011 EST
100 months ago was Thu Aug 28 10:56:10 2003 EDT

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM