我无法找到一个公式

时间:2016-04-08 20:34:15

标签: c++ date time chrono

因此我们应该将453456秒转换为年,日,小时,分钟和秒。

然而,我似乎无法过去几年。

这是我到目前为止所做的:

#include<iostream>

using namespace std;



 int main (){
        int secDis;
        int years;
        const int yearsSec = 31536000;
        int days;
        cout << "Please give me the time of travel in seconds.";
        cin >> secDis;
        years = secDis/yearsSec;
        days = (yearsSec%secDis) / 1440; /*idk if I am on the right track*/
        cout << "You have been traveling for: "
             << years << days;

如果是453456秒,则应为0年5天5小时57分36秒。

//我讨厌我的数学技能。

4 个答案:

答案 0 :(得分:3)

您可以在行中反转secDisyearsSec的顺序来计算天数。

此外,一天中的秒数为:24 x 60 x 60,即86400。你的订单是60。

年数之后剩余的秒数为(secDis % yearsSec)。 因此,您需要使用:

days = (secDis % yearsSec ) / 86400;

答案 1 :(得分:2)

@HowardHinnant为此类问题提供了瑞士军刀date library,请参阅this Q&A,之后使用

std::cout << human_readable_difference(second_point{453456s},
                                       second_point{0s});}

will indeed print

  

0年0个月5天5小时57分36秒

答案 2 :(得分:1)

我真的很喜欢TemplateRex's answer! (upvoted it)。

但是这里只用<chrono>库来解决这个问题的方法,假设你的定义是一年是365天(一个非常粗略的假设):

#include <chrono>
#include <iostream>

int
main()
{
    using namespace std;
    using namespace std::chrono;

    using days  = duration<int, ratio_multiply<ratio<24>, hours::period>>;
    using years = duration<int, ratio_multiply<ratio<365>, days::period>>;

    auto s = 453456s;
    auto y = duration_cast<years>(s);
    s -= y;
    auto d = duration_cast<days>(s);
    s -= d;
    auto h = duration_cast<hours>(s);
    s -= h;
    auto m = duration_cast<minutes>(s);
    s -= m;
    std::cout << y.count() << " years "
              << d.count() << " days "
              << h.count() << " hours "
              << m.count() << " minutes "
              << s.count() << " seconds\n";
}

<chrono>已有单位hoursminutesseconds。只需为daysyears再添加两个单元,现在您只需使用duration_castseconds连续截断为较粗的单位,然后从中删除该截断秒(模运算)。只需继续使用更精细和更精细的单位,直到达到最好的单位(在此示例中为seconds)。上述计划输出:

0 years 5 days 5 hours 57 minutes 36 seconds

这样,<chrono>可以为您完成所有转换操作,从而减少出错的可能性。

答案 3 :(得分:0)

您希望分部secDis / yearsSec的余数为secDis % yearsSec - 而不是yearsSec % secDis
(也就是说,要获得余数,请将/替换为%。)

如果您明确定义每个时间单位的秒数,我相信会更容易:

// Let the computer do the computing.
const int perMinute = 60;
const int perHour =   60 * perMinute;
const int perDay =    24 * perHour;
const int perYear =   365 * perDay;

并拼出计算的每一步:

int years =       totalSeconds / perYear;
int daySeconds =  totalSeconds % perYear;
int days =        daySeconds / perDay;
int hourSeconds = daySeconds % perDay;
int hours =       hourSeconds / perHour;
// ...