2010-03-10 235 views
7

嘿大家。我继续学习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; 

它的工作原理和正确答案来了,但在完成之后我看了看其他人如何解决了它,他们是不同的。我想知道如果我错过了什么。

谢谢,丹。

+1

它有什么不同? – Mark 2010-03-10 18:41:40

+0

天=时间/ 86400 小时=(时间/ 3600) - (天* 24) 分钟=(时间/ 60) - (天* 1440) - (小时* 60) 秒=时间模60 感谢。 – Dan 2010-03-10 18:42:35

回答

5

有关编程的一件事情是,从来没有一种方法可以做某件事。事实上,如果我想着它,我可能会想出十几种完全不同的方法来实现这一点。如果您的代码符合要求,您不会错过任何内容。

为了您的娱乐,这里的格式化涨分办法:分: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)); 
1

例如: 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); 
+0

是的,我的意思是放弃时间,但谢谢你的答复。 – Dan 2010-03-10 20:01:20

8

这对我来说似乎是秒转换成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

+0

你确定吗?用你的代码,我得到1641秒等于天数= 0小时= 1分钟= 27秒= 21,这对我来说似乎不太可能(一小时太多) – Wim 2014-04-23 09:28:56

+0

是的,你是正确的Wim。转换为细分时间时,您必须使用gmtime而不是本地时间。也许你在UTC +01:00时区(例如CET),其中一小时的差异来自哪里。 – stoycho 2014-04-25 13:30:23

+0

啊,没有想到那个,非常感谢你:-)但是我现在使用的是John Dibling的答案(见上面): int hours = floor(totalseconds/3600.0); int minutes = floor(fmod(totalseconds,3600.0)/60.0); int seconds = fmod(totalseconds,60.0); human_readable.sprintf(“%01du%02dm%02ds”,小时,分钟,秒); – Wim 2014-04-26 09:01:59

3

我认为是斯蒂芬·普拉塔的书挑战。我做了如下:

#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; 
}