2017-06-10 11 views
1

私はC++ 11で作業しており、発行日に基づいてアイテムの有効期限を計算しようとしています。アイテムが30日以上前に発行された場合、それが期限切れする必要があります。C++で有効期限を確認する11

#include <ctime> 

bool isExpired() { 

    std::chrono::system_clock::time_point tend = tstart + std::chrono::hours(30 * 24); 
    std::chrono::system_clock::time_point tnow = std::chrono::system_clock::now(); 

    bool expired = tnow >= tend; 
    return expired; 
} 

をしかし、私は簡潔に入力開始日のことができるようにしていないようです。いくつかの他の質問には、いくつかのような

auto ymd = jun/9/2017; // Yields a year_month_day type 
std::chrono::system_clock::time_point tstart = sys_days(ymd); 

は、C++ 11の中に働くかもしれないが、Xcodeのは確かにそれを好きではないと私はC++ 14と上記の機能をまたいだ場合はわからないんだことが示されました。

この計算をC++ 11で実行する簡潔な方法は何ですか?

+0

あなたは「私は簡潔に入力開始日のことができるようにしていないようです」とは何を意味するのですか? 'std :: chrono :: system_clock :: now()'の何が問題なのですか? – Rakete1111

+0

それはちょうど私かもしれませんが、コードの2番目の部分の文が論理的な順序から少し外れているようです...そして、あなたのisExpired関数の中にあると思われる "tstart"は何ですか?目に見える宣言なしでそれを使用しています... –

+0

@ Rakete1111 'tstart'を' 2017年6月9日 'に設定したいと思っています – Steve

答えて

1

私が正しくあなたの質問(run it)理解している場合:

#include <iostream> 
#include <chrono> 
#include <sstream> 
#include <iomanip> 

bool is_expired(std::chrono::system_clock::time_point issued_time) 
{ 
    using namespace std; 
    using namespace std::chrono; 
    typedef duration< int, ratio_multiply < hours::period, ratio<24> >::type > days; 
    return duration_cast<days>(system_clock::now() - issued_time) > days { 30 }; 
} 

auto operator""_issued(const char* s) // see http://e...content-available-to-author-only...e.com/w/cpp/language/user_literal 
{ 
    std::istringstream iss { s }; 
    std::tm t {}; 
    iss >> std::get_time(&t, "%Y%m%d"); 
    return std::chrono::system_clock::from_time_t(std::mktime(&t)); 
} 

int main() 
{ 
    std::cout << (is_expired(20170101_issued) ? "expired" : "valid") << std::endl; 
    std::cout << (is_expired(20170601_issued) ? "expired" : "valid") << std::endl; 
    return 0; 
} 
+0

'auto operator" "_"はいくつかの理由から、C++ 14の構造体です。 C++ではなく 'std :: chrono :: time_point 発行_(const char * s)'に変更されました。 – Steve

+0

[ユーザ定義リテラル](http://en.cppreference.com/ w/cpp/language/user_literal)は、C++ 11の追加です。通常の関数も良いです。 – ZDF

5

Howard Hinnant's datetime library(これは素晴らしいです!)を使用しようとしているようです。それはあらかじめインストールされていません。上のリンクからそれを入手してください。使用している部品については、ヘッダ"date.h"using namespace date;だけが必要です。

同じdate.hヘッダーを使用して、必要に応じてhoursという式の代わりにdays{30}と言うこともできます。いずれも動作します。

+0

私は見ていきます。私の希望は、単純なC++ 11のみを使用することでした。 – Steve

+1

あなたはdatetime libにtagline "great dates again"を追加してください。 – TemplateRex

関連する問題