2016-09-12 7 views
3

「YYYY-MM-DD HH:MM:SS」という文字列形式で指定された時刻を検証し、最新の日付を確認したいとします。「YYYY:MM:DD HH:MM:SS」形式の時刻をC++で検証する方法は?

私は与えられた文字列を秒に変換し、次のように比較することができます。

std::string dateStr1 = "2016-06-31 02:00:58"; // June 31 2016 does not exist 
std::string dateStr2 = "02:00:00"; 

std::istringstream date_s(dateStr1); 
struct tm date_c; 
date_s >> std::get_time(&date_c, "%Y-%m-%d %H:%M:%S"); 
std::time_t seconds1 = std::mktime(& date_c); 

std::istringstream date_s2("2001-10-01 02:10:00"); 
struct tm date_c2; 
date_s2 >> std::get_time(&date_c2, "%Y-%m-%d %H:%M:%S"); 
std::time_t seconds2 = std::mktime(& date_c2); 

if(seconds1 > seconds2){ 
    cout<<" Seconds1 is greater "<<seconds1<<endl; 
}else{ 
    cout<<" Seconds2 is greater "<<seconds2<<endl; 
} 

回答:Seconds1 is greater 1467334858

問題:このメソッドは存在しない日付に変換します。 (dateStr1に指定された日付は存在しませんが、mktime()はこの日付の時刻を指定します)

日付が存在するかどうかを確認する方法はありますか? cppreference documentation of mktimeから

+1

これが原因タイムゾーンの変更とうるう秒に非自明です。 – MSalters

答えて

0

変換が成功した場合は、時刻オブジェクトが修正されます。すべての フィールドは、適切な範囲に合わせて更新されます。 time-> tm_wday およびtime-> tm_ydayは、 他のフィールドで利用可能な情報を使用して再計算されます。

これは、日付が有効かどうかを確認するために使用できます。それが無効だった場合は、tm構造体は、mktimeによって変更されます。

std::string dateStr1 = "2016-06-31 02:00:58"; // June 31 2016 does not exist 
std::string dateStr2 = "02:00:00"; 

std::istringstream date_s(dateStr1); 
struct tm date_c, date_c_cmp; 
date_s >> std::get_time(&date_c, "%Y-%m-%d %H:%M:%S"); 
date_c_cmp = date_c; // store original to compare later 
std::time_t seconds1 = std::mktime(& date_c); 
if(date_c.tm_year != date_c_cmp.tm_year // compare with original 
     || date_c.tm_mon != date_c_cmp.tm_mon 
     || date_c.tm_mday != date_c_cmp.tm_mday 
     || date_c.tm_hour != date_c_cmp.tm_hour 
     || date_c.tm_min != date_c_cmp.tm_min 
     || date_c.tm_sec != date_c_cmp.tm_sec) 
    std::cout << "invalid" << std::endl; 

std::istringstream date_s2("2001-10-01 02:10:00"); 
struct tm date_c2; 
date_s2 >> std::get_time(&date_c2, "%Y-%m-%d %H:%M:%S"); 
std::time_t seconds2 = std::mktime(& date_c2); 

if(seconds1 > seconds2){ 
    std::cout<<" Seconds1 is greater "<<seconds1<<std::endl; 
}else{ 
    std::cout<<" Seconds2 is greater "<<seconds2<<std::endl; 
} 
+0

はいこれは問題なく動作します。ありがとうございました。 – Kid

関連する問題