这是我如何生成我想要添加1年的日期。提前谢谢。
char tmpbuf[128];
time_t ltime;
struct tm *today;
stringstream reD;
string todayDate;
time( <ime );
today = localtime( <ime );
strftime( tmpbuf, 128,"%Y-%m-%d_%H:%M:%S", today );
reD << tmpbuf;
reD >> todayDate;
boost::replace_all(todayDate, "_", " ");
cout << todayDate << endl;
好吧我已经决定使用提升,因为它会更容易添加天,所以2个例子我需要一个添加1年,一个添加14天,继承人我有这样的票价
#include "boost/date_time.hpp"
#include "boost/date_time/local_time/local_time.hpp"
using namespace boost::posix_time;
using namespace boost::local_time;
int main(){
local_date_time t = local_sec_clock::local_time(time_zone_ptr());
local_time_facet* lf(new local_time_facet("%Y-%m-%d_%H:%M:%S"));
std::cout.imbue(std::locale(std::cout.getloc(), lf));
std::cout << t << std::endl;
return 0;
}
编辑将时间放入字符串
stringstream reD;
reD.imbue(locale(reD.getloc(), lf));
reD << t;
bthis = reD.str();
cout << bthis << endl;
答案 0 :(得分:5)
如果你正在使用C ++,我强烈建议boost::date_time从中解决问题。
答案 1 :(得分:3)
我同意使用boost::date_time
,但是,此处的解决方案非常简单。
today->tm_year++;
虽然,如果您碰巧再次调用localtime,该值将被覆盖,因此您应该复制一份。使today
成为实例而不是指针,并取消引用localtime的返回值,如下所示:
today = *localtime( <ime );
你必须考虑到某些异常现象,例如从闰年2月29日起增加一年。
修改:我发现您决定最终使用boost::date_time
。这使事情变得更加简单。这是你如何添加一年:
t += boost::gregorian::years(1);
以下是您添加14天的方式:
t += boost::gregorian::days(14);
或者
t += boost::gregorian::weeks(2);
答案 2 :(得分:2)
没有“增加一年”这样的事情。
让我们假设您将年份增加1,毕竟,这就是您的目标。
不幸的是,我们处理时间的方式有些不一致:
闰年:如果你是在2008年2月29日,增加一年是什么意思? 2009年2月28日或2009年3月1日? (提示:更改月份对于日历的用户来说非常混乱)
leap seconds:在6月30日或12月31日,可能会在最后一分钟添加一两秒,使该分钟为61或62秒。虽然这完全不一致,幸运的是现在放弃了,但是从1972年到2008年已经影响了多年。 (提示:再一次,改变这一天令人困惑)
特殊事件:例如1582年发生的calendar re-adjustment,其中1582年10月4日星期四之后是1582年10月15日星期五,导致整整10天的损失。
这里的问题并非真正在“添加”一年,您可以随时选择向下舍入(最好是在最终用户参与时)或向上。真正的问题是,如果你遵循这个推理,你不幸失去了添加和删除一年之间的对称性:
+
1年:2009年3月1日(四舍五入)-
1年:2008年3月1日或连续几次增加4年:
+
2年:2010年2月28日(四舍五入)+
2年:2012年2月28日Oups!
对此的数学解决方案是简单地以秒为单位评估年份持续时间Let's ask Wolfram about it:3.154×10 ^ 7秒。
但是,对于用户来说可能会非常混乱。
最后,最后一个解决方案是,无论何时根据日期和持续时间进行计算,都可以保存原始日期,自行计算持续时间,然后调整“显示”日期。
通过这种方式,您将在数学上正确(即尊重对称性和关联性),并为最终用户提供直观的行为。
class MyTime {
...
private:
tm _origin;
tm _deviation;
};
然而,这是更多的工作......所以你必须自己决定你的计划,具体取决于你的应用需求。
答案 3 :(得分:-1)
哎呀,C ++的人们们:)
// compare June 15 2018 - 2017 to 2017 - 2016
struct tm y1_tm, y2_tm, y3_tm;
time_t y1716, y1817; // differences
y1_tm.tm_sec = 0; // 2016
y1_tm.tm_min = 0;
y1_tm.tm_hour = 0;
y1_tm.tm_mon = 6;
y1_tm.tm_mday = 15;
y1_tm.tm_year = 2016 - 1900;
y1_tm.tm_mday = 1;
y2_tm.tm_sec = 0; // 2017
y2_tm.tm_min = 0;
y2_tm.tm_hour = 0;
y2_tm.tm_mon = 6;
y2_tm.tm_mday = 15;
y2_tm.tm_year = 2017 - 1900;
y2_tm.tm_mday = 1;
y3_tm.tm_sec = 0; // 2018
y3_tm.tm_min = 0;
y3_tm.tm_hour = 0;
y3_tm.tm_mon = 6;
y3_tm.tm_mday = 15;
y3_tm.tm_year = 2018 - 1900;
y3_tm.tm_mday = 1;
y1716 = mktime(&y2_tm) - mktime(&y1_tm); // 2017 - 2016
y1817 = mktime(&y3_tm) - mktime(&y2_tm); // 2018 - 2017
两个减法都产生31536000秒。将其添加到time_t 1年。