自1970年1月1日以来的年,月,周,天,小时

时间:2020-09-21 18:57:41

标签: c calendar

我需要编写一个程序来计算自1970年1月1日以来的年,月,周,天和小时数。唯一的陷阱是,月数不能超过12,周不能超过4,依此类推。

我一直在尝试各种不同的方法,例如使用模数运算符,并在总秒数方面进行一些尝试,但此时的逻辑超出了我的范围。
这是我的代码

#include <stdio.h>
#include <time.h>

int main() {
    long now = time(NULL);

    long secondsInMinute = 60;
    long secondsInHour = secondsInMinute * 60;
    long secondsInDay = secondsInHour * 24;
    long secondsInWeek = secondsInDay * 7;
    long secondsInMonth = secondsInDay * 30.42;
    long secondsInYear = secondsInMonth * 12;

    long years = now/secondsInYear;
    long months = (now-(years*secondsInYear))/secondsInMonth;
    long weeks = (now-((years*secondsInYear)+(months*secondsInMonth)))/secondsInWeek;
    long days;
    long hours;

    printf("Since Jan 1st, 1970: ");
    printf("\n%ld years have passed!", years);
    printf("\n%ld months have passed!", months);
    printf("\n%ld weeks have passed", weeks);
    printf("\n%ld days have passed", days);
    printf("\n%ld hours have passed", hours);

    return 0;
}

我的指示告诉我假设一个月中有30.42天,一年中有365天。

我能够得到年数,但是月数为9,根据我看过的一些在线计算器,这是不正确的。这主要是我的逻辑问题,我似乎无法全神贯注于如何做到这一点。

示例输出为

30 years, 4 months, 2 weeks, 4 days, 5 hours  

显然,这不是实际的时间量,而只是我的输出需要使用的格式的一个示例。我们将提供任何帮助。

1 个答案:

答案 0 :(得分:1)

我的指示告诉我假设一个月中有30.42天,一年中有365天。

以下代码是主题浮点不正确。最好用整数数学形成常数。这里我们还利用了一天中的秒数是100的倍数的优点,因此secondsInMonth的精确度是“一个月中的30.42天”。

// long secondsInMonth = secondsInDay * 30.42;
long secondsInMonth = secondsInDay * 3042 / 100;

鉴于每年365天和每月30.42天,则每年没有12个月@g_bor
不要使用12来形成年份常数,而是使用SEC_PER_YEAR (365LL*SEC_PER_DAY)

让宏成为您的朋友。
要以较大的单位(例如 year month )查找秒的总数,请不要编写类似#define SEC_PER_YEAR 31536000的代码,这样很容易出错,并且不会记录代码如何到达幻数。而是建立价值。确保计算使用wide enough constants。这与OP所做的很接近。

假设time()返回自1970年1月1日以来的秒数,通常的奇数可以忽略(le秒,夏令时,时区,时代,分辨率等),... < / p>

从最大的单位开始执行一系列/和%`

#include <stdio.h>
#include <time.h>

#define SEC_PER_MIN 60
#define SEC_PER_HOUR (60*SEC_PER_MIN)
#define SEC_PER_DAY (24L*SEC_PER_HOUR)
#define SEC_PER_WEEK (7L*SEC_PER_DAY)
#define SEC_PER_MONTH (3042LL*SEC_PER_DAY/100)
#define SEC_PER_YEAR (365LL*SEC_PER_DAY)

int main(void) {
  time_t now = time(NULL);
  printf("%s", ctime(&now));
  long long t = now;
  printf("Since Jan 1st, 1970:\n");
  printf("%lld years have passed!\n", t / SEC_PER_YEAR);
  t %= SEC_PER_YEAR;
  printf("%lld months have passed!\n", t / SEC_PER_MONTH);
  t %= SEC_PER_MONTH;
  printf("%lld weeks have passed\n", t / SEC_PER_WEEK);
  t %= SEC_PER_WEEK;
  printf("%lld days have passed\n", t / SEC_PER_DAY);
  t %= SEC_PER_DAY;
  printf("%lld hours have passed\n", t / SEC_PER_HOUR);
  t %= SEC_PER_HOUR;
}

输出

Mon Sep 21 20:40:26 2020  (local time)
Since Jan 1st, 1970:
50 years have passed!
9 months have passed!
0 weeks have passed
3 days have passed
6 hours have passed

“月数为9”->差不多了。

“月数不能超过12”-> 365 <12 * 30.42(365.04),所以没问题。

“周(不能)超过4周”-> 30.42 <5 * 7,所以那里也没有问题。

相关问题