【问题标题】:c++ Add or subtract values to the datec++ 给日期加或减值
【发布时间】:2016-12-07 22:26:52
【问题描述】:

我不知道如何为日期添加值。想象一下,我有一个像 2012-5-15 这样的日期。在我解析它之后,我分别获得了年、月和日,并尝试使用 time_t 和 mktime 将我的确切日期转换为天数。我是否有机会将其转换回我找到的天数或秒数的日期?这是我尝试执行此操作的代码的一部分;

if(operation="+"){
    tm tm1=make_tm(year,mon,day);
    time_t time1=mktime(&tm1);
    int seconds_per_day=60*60*24;
    time_t second=time1/seconds_per_day;
    int sum=second //Trying to convert to the int from my time_t, don't know      
                   //if it is neccesary
    sum=sum+value //the value I want to add 

所以,基本上如果我提供像 2012/5/15 这样的输入。它使用该方法计算它经过了多少天,但我只需要将其转换为日期并使其显示。你有什么想法吗?

【问题讨论】:

  • time_t 是自 epoc(1970 年 1 月 1 日,00:00:00 UTC)以来的秒数。见this
  • 对不起,如果这无关紧要,但如果您使用了 <chrono> 库,那么您已经为这些类定义了运算符 +
  • 是的,我将它转换为之后的天数并将其存储为一天。然后,我在那天增加了我的价值。我可以将日期视为天数,但我需要再次将其转换为日期(YYYY-M-D)
  • 我没有使用 chrono 库。其实,我试过了,但是嗯....还有其他方法吗?
  • 总是有的,只是还没弄明白! ;P

标签: c++ date time add


【解决方案1】:

如果您正在寻求一种将日期添加到特定日期的方法,这里有一种与您的尝试类似的方法:

tm addDays(tm t1, int days)
{
    time_t epoch = mktime(&t1);
    epoch += (60*60*24 * days);
    return *localtime(&epoch);
}

然后使用返回的tm 结构并访问tm_yeartm_montm_mday 成员以获得yyyymmdd 所需的输出。一个非常粗略和现成的例子(没有正确的格式):

tm t1;
std::fill((char*)&t1, (char*)&t1 + sizeof(t1), 0);
t1.tm_year = 2016;
t1.tm_mon = 8;
t1.tm_mday = 2;

auto result = addDays(t1, 30);

std::cout << result.tm_year << '/' << result.tm_mon << '/' << result.tm_mday << std::endl;

【讨论】:

    【解决方案2】:

    这是一个free, open-source C++11/14 library,可以用非常好的语法和无与伦比的性能来做你想做的事。

    #include "date.h"
    #include <iostream>
    
    int
    main()
    {
        using namespace date;
        year_month_day x = sys_days{2012_y/may/15} + days{55};
        std::cout << x << '\n';
    }
    

    这个输出:

    2012-07-09
    

    如果您更愿意自己编写,请使用此日期库使用的here are the algorithms。但是日期库以类型安全的方式将所有内容包装起来,从而在编译时捕获许多错误。

    日期库也不过是&lt;chrono&gt;库的扩展,所以和它非常兼容:

    #include "date.h"
    #include <iostream>
    
    int
    main()
    {
        using namespace date;
        using namespace std::chrono_literals;
        auto x = sys_days{2012_y/may/15} + days{55} + 7h + 30min;
        std::cout << x << '\n';
    }
    
    2012-07-09 07:30
    

    【讨论】:

      【解决方案3】:

      感谢大家的关注,但我以另一种方式解决了问题。这是我的方式;

      tm tm1=make_tm(year,mon,day);//of course I had an make_tm as struct
      time_t time1=mktime(&tm1);
      time1=time1+value*86400-86400 //because it was a second, I needed to convert the day to second. Then, I don't know why but it showed extra one day. So, again I subtracted 86400 then the problem solved.
      char *cb=ctime(&time1);
      cout<<cb<<endl;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多