【问题标题】:Check Expiration Date in C++11在 C++11 中检查到期日期
【发布时间】:2017-06-10 16:59:52
【问题描述】:

我正在使用 C++11 并希望根据项目的发布日期计算项目的到期日期。如果该项目是在 30 天前发出的,它应该是过期的:

#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 中执行此计算的简洁方法是什么?

【问题讨论】:

  • “我似乎无法简洁地输入开始日期”是什么意思? std::chrono::system_clock::now() 怎么了?
  • 可能只是我,但看起来你在第二段代码中的陈述有点不合逻辑......你的 isExpired 函数中应该包含什么“tstart”?您在没有任何可见声明的情况下使用它...
  • @Rakete1111 我想将tstart 设置为等于June 9, 2017

标签: c++ c++11 time


【解决方案1】:

您似乎正在尝试使用Howard Hinnant's datetime library(这太棒了!)。它没有预装。从上面的链接中获取。对于您正在使用的部件,您只需要标题"date.h"using namespace date;

如果您愿意,也可以使用相同的 date.h 标头,用 days{30} 代替 hours 的表达式。两者都可以。

【讨论】:

  • 我去看看。我希望只使用普通的 c++11。
  • 您应该在您的日期时间库中添加标语“让日期再次变得美好”:)
【解决方案2】:

如果我正确理解了您的问题 (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( 22000601_issued ) ? "expired" : "valid") << std::endl;
  return 0;
}

【讨论】:

  • auto operator""_ 是一个 c++14 结构有几个原因。改为std::chrono::time_point&lt;std::chrono::system_clock&gt; issued_( const char* s ),而不是c++11
  • User defined literals 是 c++11 的补充。常规函数也不错。
猜你喜欢
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 2018-07-03
  • 1970-01-01
  • 2012-03-29
  • 1970-01-01
  • 2018-01-18
  • 2018-04-18
相关资源
最近更新 更多