以秒为单位将数字拆分为天、小时、分钟和秒?

Posted

技术标签:

【中文标题】以秒为单位将数字拆分为天、小时、分钟和秒?【英文标题】:Split down a number in seconds to days, hours, minutes, and seconds? 【发布时间】:2011-09-12 21:47:33 【问题描述】:

我听说可以使用大多数编程语言中的模数% 运算符来完成此操作。真正的问题是,怎么做?我不熟悉模数的工作原理,所以过去我在使用它时遇到了困难。鉴于自 1970 年以来的当前时间(以秒为单位)1307758473.484,我如何计算使用模数的年数、天数、小时数和分钟数?

我基本上希望将其格式化为:“5 年 10 天 12 小时 7 分钟 18.56 秒”。我该怎么做?我真的很想了解这背后的逻辑,对简单的插入式解决方案感兴趣。

【问题讨论】:

【参考方案1】:

当你进行整数除法时,你会得到商和余数。例如,

5 divided by 3 is quotient 1 with remainder 2.

在编程语言中,这通常表示为:

5 / 3   # => 1
5 % 3   # => 2

你想要的转换只是这个的重复。 从较低的单位开始,然后再往上走更容易

首先,你有

1307758473.484 seconds

因为 60 秒是 1 分钟,并且

1307758473.484 / 60 = 21795974  (intended to be integer division)
1307758473.484 % 60 = 33.484,

和这个一样

21795974 minutes 33.484 seconds

因为 60 分钟是 1 小时,并且

21795974 / 60 = 363266
21795974 % 60 = 14

和这个一样

363266 hours 14 minutes 33.484 seconds

现在,有一点困难。大多数日子是 24 小时。当有闰秒时,它不是。如果您忽略闰秒并假设 1 天是 24 小时,那么通过计算,

363266 / 24 = 15136
363266 % 24 = 2

和这个一样

15136 days 2 hours 14 minutes 33.484 seconds

同样,大多数年份是 365 天。如果有闰日(年),则没有。如果您忽略闰日并假设 1 年是 365 天,那么通过计算,

15136 / 365 = 41
15136 % 365 = 171

一样 41 years 171 days 2 hours 14 minutes 33.483 seconds

【讨论】:

【参考方案2】:

Modulus 在执行整数除法时返回余数。

我认为通过先回溯一个问题来理解如何使用 Mod 是最容易的。

让我们从小时、分钟和秒开始——准确地说是 1 小时、10 分钟和 30 秒。

首先,您有 30 秒的时间。这很容易——只有 30 岁。不用多想。 现在添加分钟 - 将分钟确定为秒,您将它们乘以 60。因此 10 分钟和 30 秒 = 630 秒。

现在我们看看 mod 是如何工作的 - 因为如果您将 630 除以 60,您会得到 10.5,但如果您忽略分数(整数除法),您会得到 10。余数是秒。 p>

因此,如果您将 630 除以 60 得到 30 - 将 630 除以 30 时剩下的余数。

所以要确定分和秒,分除以 60,秒除以 60。

现在增加一个小时。一小时 = 60 分钟,60 分钟是 60*60 秒,所以 1 小时 = 3600 秒。 3600 + 600 + 30 = 4230 秒。

4230 / 3600(1 小时)= 1 - 所以我们有 1 小时

4230 % (mod) 3600 = 630 - 抓住这个,现在我们处理几分钟。

因此,如果您进一步充实这一点并添加一天 - 1 天 = 24 小时 = 24*3600 = 86400 86400+3600+600+30 = 90630

90630 / 86400 = 1 -> 1 天

90630 % 86400 = 4230 -> 剩余秒数

4230 / 3600 = 1 -> 1 小时

并重复上述逻辑。

希望这有助于清除它 - 你不断重复该迭代,你可以做几周和几年,但几个月是特别的,因为它们是不规则的,闰年也是如此。

【讨论】:

好答案。 @TK,将此与进行更改并将数字从基数x转换为基数y进行比较。这里有一个共同的模式。【参考方案3】:

当从一个小的基本单位(秒)转换为一系列较大的单位(分钟/小时/天/年/十年/世纪/千年)时,您可以使用模 (%) 运算符来跟踪剩余的基数提取每个大单位时的单位。

这是一种在基本单位中保持某种运行总计的优雅/简单的方法。开始提取具有您想要的最大单元的 BaseUnit,然后继续往下工作,直到获得原始 BaseUnit。

这仅在提取的单位为非零时有效。如果它为零,那么您根本没有提取任何基本单位并且不需要模运算符。

请务必记住,模运算的结果将始终采用原始基本单位。这可能会让人感到困惑。

让我们将 100 万秒重新表述为更大的时间单位。假设 1 年 = 31,536,000 秒,并且没有闰年或其他日历调整。

#include <cstdio>
#define SEC2CENT 3153600000
#define SEC2DEC 315360000
#define SEC2YR 31536000
#define SEC2MONTH 2592000
#define SEC2WEEK 604800
#define SEC2DAY 86400
#define SEC2HOUR 3600
#define SEC2MIN 60
main()

unsigned int sec = 1000000; //I am 1 million seconds old or...

unsigned int centuries = sec / SEC2CENT;
if (centuries) sec = sec % SEC2CENT; //if nonzero update sec

unsigned int decades = sec / SEC2DEC;
if (decades) sec = sec % SEC2DEC; //the purpose of modulo for units is this running total of base units

unsigned int years = sec / SEC2YR;
if (years) sec = sec % SEC2YR;

unsigned int months = sec / SEC2MONTH;
if (months) sec = sec % SEC2MONTH;

unsigned int weeks = sec / SEC2WEEK;
if (weeks) sec = sec % SEC2WEEK;

unsigned int days = sec / SEC2DAY;
if (days) sec = sec % SEC2DAY;

unsigned int hours = sec / SEC2HOUR;
if (hours) sec = sec % SEC2HOUR;

unsigned int minutes = sec / SEC2MIN;
if (minutes) sec = sec % SEC2MIN;

unsigned int seconds = sec; //seconds should now be less than 60 because of minutes

printf("I am now exactly %u centuries, %u decades, %u years, %u months, %u weeks, %u days, %u hours, %u minutes, %u seconds old and that is very old indeed.", centuries, decades, years, months, weeks, days, hours, minutes, seconds);

【讨论】:

以上是关于以秒为单位将数字拆分为天、小时、分钟和秒?的主要内容,如果未能解决你的问题,请参考以下文章

以秒为单位将时间间隔格式化为 X 小时(秒) Y 分钟(秒) Z 秒(秒)

获取自 Linux 上的 Epoch、Bash 以来的当前时间(以秒为单位)

如何将秒转换为小时、分钟和秒?

给定熊猫中只有小时-分钟-秒格式的列,如何以秒为单位返回总时间? [关闭]

如何在 Swift3 中以秒为单位将字符串更改为分钟?

使用适当的 tm_mday 将两个 time_t 之间的差异转换为 tm