2017-06-10 3 views
1

Ich arbeite in C++ 11 und bin auf der Suche nach dem Verfallsdatum eines Artikels auf der Grundlage seines Ausstellungsdatums zu berechnen. Wenn die Artikel wie vor mehr als 30 Tagen ausgestellt, sollte es abgelaufen sein:Überprüfen Ablaufdatum in 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; 
} 

jedoch scheine ich nicht in der Lage zu sein, zu kurz Eingang ein Startdatum. Einige andere Fragen zeigten, dass einige wie

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

arbeiten in Might ++ 11 C aber Xcode sicherlich mag es nicht, und ich bin nicht sicher, ob ich rittlings auf C++ 14 und über Funktionen.

Was ist ein kurzer Weg, um diese Berechnung in C++ 11 durchzuführen?

+0

Was meinen Sie mit „ich scheine nicht zu kurz Eingang ein Startdatum der Lage zu sein“? Was ist los mit 'std :: chrono :: system_clock :: now()'? – Rakete1111

+0

es könnte nur ich sein, aber es sieht aus wie Ihre Aussagen in der zweiten Teil des Codes sind ein bisschen außerhalb der logischen Reihenfolge ... Und was ist "Tstart" soll in Ihrer Funktion isExpired sein? Sie verwenden es ohne sichtbare Deklaration ... –

+0

@ Rakete1111 Ich möchte 'tstart' gleich' Juni 9, 2017' setzen – Steve

Antwort

1

Wenn ich deine Frage richtig verstanden (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" "_' ist ein C++ 14 Konstrukt aus mehreren Gründen. Geändert in 'std :: chrono :: time_point ausgegebene_ (const char * s)' statt für C++ 11 – Steve

+0

[Benutzerdefinierte Literale] (http://en.cppreference.com/ w/cpp/language/user_literal) ist ein C++ 11-Zusatz. Eine regelmäßige Funktion ist auch gut. – ZDF

5

Es sieht so aus, als ob Sie versuchen, Howard Hinnant's datetime library zu verwenden (was großartig ist!). Es ist nicht vorinstalliert. Holen Sie es über den obigen Link. Für die Teile, die Sie verwenden, ist nur die Kopfzeile "date.h" und eine using namespace date; erforderlich.

Mit der gleichen date.h-Header können Sie auch sagen days{30} anstelle des Ausdrucks, den Sie mit hours haben, wenn Sie möchten. Entweder funktioniert.

+0

Ich guck mal. Meine Hoffnung war, nur reines C++ 11 zu verwenden. – Steve

+1

Sie sollten den Tagline "makeing dates great again" zu Ihrer datetime lib hinzufügen :) – TemplateRex