#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( 22000601_issued ) ? "expired" : "valid") << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y2hyb25vPgojaW5jbHVkZSA8c3N0cmVhbT4KI2luY2x1ZGUgPGlvbWFuaXA+Cgpib29sIGlzX2V4cGlyZWQoIHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6OnRpbWVfcG9pbnQgaXNzdWVkX3RpbWUgKQp7CiAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKICB1c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm87CiAgdHlwZWRlZiBkdXJhdGlvbjwgaW50LCByYXRpb19tdWx0aXBseSA8IGhvdXJzOjpwZXJpb2QsIHJhdGlvPDI0PiA+Ojp0eXBlID4gZGF5czsKICByZXR1cm4gZHVyYXRpb25fY2FzdDwgZGF5cyA+KCBzeXN0ZW1fY2xvY2s6Om5vdygpIC0gaXNzdWVkX3RpbWUgKSA+IGRheXMgeyAzMCB9Owp9CgphdXRvIG9wZXJhdG9yIiJfaXNzdWVkKCBjb25zdCBjaGFyKiBzICkgLy8gc2VlIGh0dHA6Ly9lLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5lLmNvbS93L2NwcC9sYW5ndWFnZS91c2VyX2xpdGVyYWwKewogIHN0ZDo6aXN0cmluZ3N0cmVhbSBpc3MgeyBzIH07CiAgc3RkOjp0bSB0IHt9OwogIGlzcyA+PiBzdGQ6OmdldF90aW1lKCAmdCwgIiVZJW0lZCIgKTsKICByZXR1cm4gc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6ZnJvbV90aW1lX3QoIHN0ZDo6bWt0aW1lKCAmdCApICk7Cn0KCmludCBtYWluKCkKewogIHN0ZDo6Y291dCA8PCAoaXNfZXhwaXJlZCggMjAxNzAxMDFfaXNzdWVkICkgPyAiZXhwaXJlZCIgOiAidmFsaWQiKSA8PCBzdGQ6OmVuZGw7CiAgc3RkOjpjb3V0IDw8IChpc19leHBpcmVkKCAyMjAwMDYwMV9pc3N1ZWQgKSA/ICJleHBpcmVkIiA6ICJ2YWxpZCIpIDw8IHN0ZDo6ZW5kbDsKICByZXR1cm4gMDsKfQ==