7

你能给我命名一些从 C++ 获取当前“yyyymmdd”(例如“20121219”)字符串的简单方法吗?升压是允许的,所以这应该使它更容易。我可以使用ctime,但设置该结构有点痛苦。

我已经这样做了

boost::gregorian::date current_date(boost::gregorian::day_clock::local_day());
int year_int = current_date.year();
int month_int = current_date.month();
int day_int = current_date.day();

然后将ints 转换为strings 使用

std::string year = boost::lexical_cast<std::string>(year_int);
std::string month = boost::lexical_cast<std::string>(month_int);
std::string day = boost::lexical_cast<std::string>(day_int);

但问题是第 1 天将是“1”而不是“01”。

4

5 回答 5

5

使用日期时间 I/O 和构面:

/// Convert date operator
std::string operator()(const boost::gregorian::date& d) const
{
  std::ostringstream os;
  auto* facet(new boost::gregorian::date_facet("%Y%m%d"));
  os.imbue(std::locale(os.getloc(), facet));
  os << d;
  return os.str();
}
于 2012-12-19T17:42:20.113 回答
3

作为单行:

#include <boost/date_time/gregorian/gregorian.hpp>

std::string date = boost::gregorian::to_iso_string(boost::gregorian::day_clock::local_day());

http://www.boost.org/doc/libs/1_57_0/doc/html/date_time/gregorian.html#date_time.gregorian.date_class

于 2015-02-20T16:16:04.167 回答
2

<ctime> 可怕,但实际上以几乎直接的方式实现了您的需求:

char out[9];
std::time_t t=std::time(NULL);
std::strftime(out, sizeof(out), "%Y%m%d", std::localtime(&t));

测试

于 2012-12-19T17:51:38.343 回答
1

boost中有一堆格式标志可以使用:

http://www.boost.org/doc/libs/1_52_0/doc/html/date_time/date_time_io.html

于 2012-12-19T17:43:26.290 回答
1

@Matteo Italia 答案的一个稍微面向 C++ 的版本将std::put_time与结构结合使用tm

std::time_t time = std::time(nullptr);
std::tm* tm = std::localtime(&time);

std::ostringstream ss;
ss << std::put_time(tm, "%Y%m%d");

std::cout << ss.str() << std::endl;

当然,您可以将 的结果存储ss.str()std::string.

于 2012-12-19T18:01:54.260 回答