【问题标题】:Convert seconds to Days, Minutes and Seconds将秒转换为天、分和秒
【发布时间】:2011-01-26 01:09:34
【问题描述】:

大家好。我一直在继续学习 C++,并且一直在接受将秒转换为日、分和秒等格式的“挑战”。

例如:31600000 = 365 天 46 分钟 40 秒。

using namespace std;
const int hours_in_day = 24;
const int mins_in_hour = 60;
const int secs_to_min = 60;

long input_seconds;
cin >> input_seconds;

long seconds = input_seconds % secs_to_min;
long minutes = input_seconds / secs_to_min % mins_in_hour;
long days = input_seconds / secs_to_min / mins_in_hour / hours_in_day;

cout << input_seconds << " seconds = "
     << days << " days, "
     << minutes << " minutes, "
     << seconds << " seconds ";

return 0;

它可以工作并提出正确的答案,但在完成它之后,我查看了其他人如何解决它,而他们的答案却有所不同。我想知道我是否遗漏了什么。

谢谢,丹。

【问题讨论】:

  • 天 = 时间 / 86400 小时 = (时间 / 3600) - (天 * 24) 分钟 = (时间 / 60) - (天 * 1440) - (小时 * 60) 秒 = 时间 mod 60谢谢。

标签: c++ date time seconds


【解决方案1】:

关于编程的一件事是,做某事永远不会只有一种方法。事实上,如果我下定决心,我可能会想出十几种完全不同的方法来实现这一目标。如果您的代码符合要求,您就不会错过任何东西。

为了您的娱乐,这里有一种在 Windows 下格式化小时:分钟:秒的方法(elapsed 是一个双精度数 & 表示自...某事以来经过的秒数)

sprintf_s<bufSize>(buf, "%01.0f:%02.0f:%02.2f", floor(elapsed/3600.0), floor(fmod(elapsed,3600.0)/60.0), fmod(elapsed,60.0));

【讨论】:

    【解决方案2】:

    例如:31600000 = 365 天 46 分钟 40 秒。

    真的吗?

    $ bc
    365*24*60*60 + 46*60 + 40
    31538800
    
    365*24*60*60 + 1066*60 + 40
    31600000
    

    您的意思是“将输入转换为天、小时、分钟和秒,然后丢弃小时”还是“将输入转换为天、一天内的总分钟数(即可以超过 60 分钟)和秒” ?

    在第二种情况下,我认为您应该将指令替换为

    long minutes = input_seconds / secs_to_min % (mins_in_hour * hours_in_day);
    

    【讨论】:

    • 是的,我的意思是放弃工作时间,但感谢您的回复。
    【解决方案3】:

    在我看来,这是将秒数转换为 DD/hh/mm/ss 的最简单方法:

    #include <time.h>
    #include <iostream>
    using namespace std;    
    
    time_t seconds(1641); // you have to convert your input_seconds into time_t
    tm *p = gmtime(&seconds); // convert to broken down time
    
    cout << "days = " << p->tm_yday << endl;
    cout << "hours = " << p->tm_hour << endl;
    cout << "minutes = " << p->tm_min  << endl;
    cout << "seconds = " << p->tm_sec << endl;
    

    希望对你有帮助!

    问候,

    Stoycho

    【讨论】:

    • 你确定吗?使用您的代码,我得到 1641 秒等于 days = 0 hours = 1 minutes = 27 seconds = 21 ,这对我来说似乎不太可能(一小时太多)
    • 是的,你是对的 Wim。转换为细分时间时,您必须使用 gmtime 而不是 localtime。也许您位于 UTC +01:00 时区(例如 CET),一小时时差来自该时区。
    • 啊,没想到那个,非常感谢 :-) 但我目前正在使用 John Dibling 的答案(见上文):int hours = floor(totalseconds/3600.0); int 分钟 = floor(fmod(totalseconds,3600.0)/60.0); int 秒 = fmod(totalseconds,60.0); human_readable.sprintf("%01du %02dm %02ds", 小时, 分钟, 秒);
    • @stoycho 感谢您的回答。我想知道,你如何使用你的解决方案来显示毫秒?干杯!!
    【解决方案4】:

    我认为这是来自 Stephen Prata 书中的挑战。我是这样做的:

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        long input_seconds = 31600000;
    
        const int cseconds_in_day = 86400;
        const int cseconds_in_hour = 3600;
        const int cseconds_in_minute = 60;
        const int cseconds = 1;
    
        long long days = input_seconds / cseconds_in_day;
        long hours = (input_seconds % cseconds_in_day) / cseconds_in_hour;
        long minutes = ((input_seconds % cseconds_in_day) % cseconds_in_hour) / cseconds_in_minute;
        long seconds = (((input_seconds % cseconds_in_day) % cseconds_in_hour) % cseconds_in_minute) / cseconds;
        cout << input_seconds << " seconds is " << days << " days, " << hours << " hours, " << minutes << " minutes, and " << seconds << " seconds.";
    
        cin.get();
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 2015-02-03
      • 2012-01-06
      • 2012-09-27
      • 1970-01-01
      • 2015-03-01
      相关资源
      最近更新 更多