C ++添加1年迄今

时间:2011-12-09 19:18:39

标签: c++ datetime boost

这是我如何生成我想要添加1年的日期。提前谢谢。

char tmpbuf[128];
time_t ltime;
struct tm *today;
stringstream reD;
string todayDate;
time( &ltime );
today = localtime( &ltime );
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;

4 个答案:

答案 0 :(得分:5)

如果你正在使用C ++,我强烈建议boost::date_time从中解决问题。

答案 1 :(得分:3)

我同意使用boost::date_time,但是,此处的解决方案非常简单。

today->tm_year++;

虽然,如果您碰巧再次调用localtime,该值将被覆盖,因此您应该复制一份。使today成为实例而不是指针,并取消引用localtime的返回值,如下所示:

today = *localtime( &ltime );

你必须考虑到某些异常现象,例如从闰年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天的损失。

这里的问题并非真正在“添加”一年,您可以随时选择向下舍入(最好是在最终用户参与时)或向上。真正的问题是,如果你遵循这个推理,你不幸失去了添加和删除一年之间的对称性:

  • 原文:2008年2月29日
  • + 1年:2009年3月1日(四舍五入)
  • - 1年:2008年3月1日

或连续几次增加4年:

  • 原文:2008年2月29日
  • + 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年。