c ++在日期

时间:2016-08-02 14:00:15

标签: c++ date time add

我无法想象如何在日期中添加值。想象一下,我有一个像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这样的输入。它计算使用该方法传递的天数,但我只需要将其转换为日期并显示它。你有什么想法吗?

3 个答案:

答案 0 :(得分:2)

如果您想要一种方法来将日期添加到特定日期,可以采用与您的尝试类似的方式进行此操作:

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;

答案 1 :(得分:1)

这是一个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。但是日期库以一种类型安全的方式包装所有内容,在编译时捕获了许多错误。

日期库也只是<chrono>库的扩展,因此与它非常兼容:

#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

答案 2 :(得分:0)

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

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;