我有一个函数,需要计算昨天的,今天的和明天的日期,我用localtime来得到今天的日期,为了得到明天的日期,我给tm_mday加1,问题是如果当前日期是3/31如果我在tm_mday上加1,它将变成3/32. C++中有日期包吗处理结转到下个月,还是我需要编写逻辑来完成?
string get_local_date(const string &s) {
time_t rawtime;
struct tm * timeinfo;
time (&rawtime);
timeinfo = localtime(&rawtime);
if (s == "tomorrow") {
timeinfo->tm_mday += 3; // day becomes 3/32
}
if (s == "yesterday") {
timeinfo->tm_mday -= 1;
}
char buffer[80];
strftime(buffer,80,"%04Y-%m-%d",timeinfo);
string str(buffer);
return str;
}
4条答案
按热度按时间lyr7nygr1#
在 * 大多数 * 系统上,
(std::)time_t
表示为自POSIX纪元(1970年1月1日00:00 UTC)以来经过的整数秒。由于1天中有86400秒(不包括闰秒),您可以简单地将明天的86400加上,并将昨天的86400减去,例如:然而,你真的应该使用原生的
<chrono>
库,它是在C++11中引入的,来处理这类东西,例如:of1yzvn42#
C++中有一个日期包叫做chrono,你可以用它来处理日期和时间的计算。
dddzy1tm3#
下面是一个C++20版本,它获取今天的本地日期,而不是UTC日期,根据您的本地时区和程序运行的时间,UTC日期可以相差1天:
这可以很容易地自定义到另一个时区,通过更改一行,可能会输出稍微不同的结果。例如:
演示。
f2uvfpb94#
即使使用普通的老C,这实际上也是一件非常容易管理的事情,因为
mktime
规范化了struct tm
中包含的日期。例如:结果:
所以,是的,所有这些工作都很好。
不要误会我的意思,我当然推荐使用C++ 20日期库或霍华德Hinnant的日期库(这几乎是标准化到C++20中的东西)如果你可以的话--这是一个很棒的库,工作得很好。(不管是什么原因)这是不容易得到的,你不需要自己写所有的东西。你需要的日期操作几乎一样简单,即使只使用C库。