【问题标题】:Please help! Trying to write a Program that uses today's date请帮忙!试图编写一个使用今天日期的程序
【发布时间】:2020-11-01 00:36:55
【问题描述】:

在课堂上,我的教授给了我们一个额外的学分作业,如果我们愿意,我们可以做。我在其中的一部分上遇到了麻烦,因为她希望我们做一些我们在课堂上还没有学到的东西。问题是创建一个程序,在其中输入他们的生日,然后有一个函数可以显示他们的生日。我做了一些研究,发现我必须使用 time.h 的东西,而且我需要将他们的生日转换为 Epoch 时间并从今天的 Epoch 时间中减去。我不确定我的代码中的所有内容是如何工作的:(我也不必担心闰日)

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


int main() {
    int month, day, year, AgeinDays;

    printf("Enter birthday (mm): ");
    scanf("%d", &month);
    printf("Enter birthday (dd): ");
    scanf("%d", &day);
    printf("Enter birthday (yyyy): ");
    scanf("%d", &year);

    AgeinDays = calc_age(month, day, year);
    printf("%d", AgeinDays);
}

int calc_age(int m, int d, int y) {
    int DaysinMonth[12] = {31, 28, 31, 20, 31, 31, 31, 31, 30, 31, 30, 31};

    struct tm t;
    time_t t_of_day;

    t.tm_year = //Need to subtract todays year form y
    t.tm_mon = m;          
    t.tm_mday = d;          
    t.tm_isdst = -1;        
    t_of_day = mktime(&t);

    printf("You are this many seconds old", (long) t_of_day);
}

【问题讨论】:

  • 在 Linux 上,请参阅“man 7 time”以获得概述”和“man mktime”......这应该可以让您继续使用时间函数。

标签: c time.h


【解决方案1】:

我不知道您对unix time 的概念有多熟悉。这是一个通过计算从 1970 年 1 月开始的秒数来描述时间点的系统。要获得从特定日期到现在的天数,您可以减去时间戳并将结果除以 86400 (=60*60* 24)。因此,您不必考虑闰年。如果你是 8000 天,那么你就是 8000 天。一年是 5 天还是 365.25 天并不重要。
要继续您的解决方案 (time.h),您可以尝试以下操作:

double calc_age(const unsigned int m, const unsigned int d, const unsigned int y) {
    

    struct tm t = {0};
    time_t t_of_day;

    t.tm_year = y - 1900; // look at the documentation of struct tm
    t.tm_mon = m - 1;          
    t.tm_mday = d;          
    t.tm_isdst = -1;        
    t_of_day = mktime(&t);
    
    time_t now;
    time(&now);

    return  round((difftime(now,t_of_day)/(60.0*60.0*24.0)));

}

请记住,您使用 mktime 的解决方案可能不适用于 1970 年之前的日期。并且您必须对其余代码(printf、foward decleration 等)进行一些调整。最后注意:我的代码并不完美解决方案也许你再考虑一下数据类型和舍入。

【讨论】:

  • struct tm t; 可能有其他成员,而不是通常的 9。最好将 t 归零,struct tm t = {0}; 首先。
  • difftime() 对于查找便携时差也很有用。
  • 是的,你完全正确。我只是写了一些东西来展示这个想法。我编辑了建议,希望没问题。
  • "将结果除以 86400 (=60*60*24)。" --> 考虑通过60.0*60*24 是否应该将代码移植到 16 位嵌入式处理器。 60*60*24 溢出 16 位 int
  • 我也更改了数据类型,因为强制转换通常不是一个好主意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-19
  • 1970-01-01
  • 2011-09-26
  • 1970-01-01
相关资源
最近更新 更多