如何正确添加日期到日期?

时间:2015-11-10 20:39:56

标签: c++

我是C ++的新手,我在Unixtime添加方面遇到了问题。例如,我有一个日期8.10.2014 14:49

我需要添加26天,12小时,44分钟。这是我的代码:

#include <iostream>
#include <ctime>

struct Date {
    int Minute;
    int Hour;
    int Day;
    int Month;
    int Year;
};

int main(){
    time_t rawtime;
    struct tm * timeinfo;

    Date startDate;
    std::cin >> startDate.Year;
    std::cin >> startDate.Month;
    std::cin >> startDate.Day;
    std::cin >> startDate.Hour;
    std::cin >> startDate.Minute;

    time ( &rawtime );
    timeinfo = localtime ( &rawtime );
    timeinfo->tm_year = startDate.Year - 1900;
    timeinfo->tm_mon = startDate.Month -1;
    timeinfo->tm_mday = startDate.Day;
    timeinfo->tm_hour = startDate.Hour;
    timeinfo->tm_min = startDate.Minute;

    rawtime = mktime ( timeinfo ) + 2555027;

    std::cout << rawtime << std::endl;

    struct tm *tm = localtime(&rawtime);
    char date[80];
    strftime(date, sizeof(date), "%Y %m %d %H %M", tm);
    std::cout << date;
}

答案与事实大致相似,但不要纠正。为什么?

1 个答案:

答案 0 :(得分:0)

如果你有C ++ 11(或C ++ 14)和一个相对最新的编译器,你可以使用这个库:

http://howardhinnant.github.io/date/tz.html

像这样:

#include <chrono>
#include <iostream>
#include "tz.h"

int
main()
{
    using namespace date;
    using namespace std::chrono_literals;
    auto zone = current_zone();
    auto time = make_zoned(current_zone(), local_days{8_d/10/2014} + 14h + 49min);
    time = time.get_sys_time() + days{26} + 12h + 44min;
    std::cout << time << '\n';
}

这大致相当于您拥有的内容,它假定您指定的日期位于计算机的本地时区,并且您还希望将结果存储在计算机的本地时区中。对我来说,这输出:

2014-11-04 02:33:00 EST

但是你也提到过&#34; Unixtime&#34;,这对我来说意味着Unix time。此时间以UTC为单位,缺少夏令时等复杂功能。如果打算在Unix time中执行此操作,则可以使用此库更轻松,更便宜地执行此操作:

http://howardhinnant.github.io/date/date.html

像这样:

#include <chrono>
#include <iostream>
#include "date.h"

int
main()
{
    using namespace date;
    using namespace std::chrono_literals;
    auto time = sys_days{8_d/10/2014} + 14h + 49min + days{26} + 12h + 44min;
    std::cout << time << '\n';
}

将可以输出:

2014-11-04 03:33

使用&#34; chrono literals&#34; (例如14h)暗示C ++ 14。如果您使用的是C ++ 11,则可以使用更详细的hours{14}hours在名称空间std::chrono中)替换。如果你在C ++ 03中,那么,never mind。 : - )