我可以编写一个函数来解析字符串日期,但我觉得我在这里重新发明了轮子。有没有一种更快的,也许是内置C++方式从这种格式的字符串日期:1/4/2000 到更易于使用的 int 如 20000104?
除非你也需要内置的C++方法来做验证,否则"明显"的解析是:
int parseDate(const std::string &input) {
int month;
int day;
int year;
if (std::sscanf(input.c_str(), "%d/%d/%d", &month, &day, &year) != 3) {
// handle error
} else {
// check values to avoid int overflow if you can be bothered
return 10000 * year + 100 * month + day;
}
}
如果要编写几行代码类型安全,则可以使用流提取器而不是sscanf
。
标准库中肯定没有任何东西可以为您完成10000 * year + 100 * month + day
。如果你不执着于这个确切的值,你只需要一个正确顺序的整数,那么你可以看看你的平台是否有一个函数来告诉你所谓的"朱利安日"。
标准库函数是strptime()
的,但不确定这在C++中被认为是多"干净"。
如果您对strptime()
感到满意,以下是您将如何将其用于您的案例:
struct tm when;
strptime("1/4/2000", "%m/%d/%y", &tm); // Note: should check return value.
const int sortable = 10000 * tm.tm_year + 100 * tm.tm_month + tm.tm_day;
当然,如果你愿意,你可以使用Boost;相关的角落似乎是Posix Time。