请帮忙!尝试编写使用今天的日期的程序

问题描述

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

#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,year);
    printf("%d",AgeinDays);
}

int calc_age(int m,int d,int y) {
    int DaysinMonth[12] = {31,28,31,20,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);
}

解决方法

我不知道您对unix time的概念有多熟悉。这是一个通过计算从1970年1月1日开始的秒数来描述时间点的系统。要获取从特定日期到现在的天数,您可以减去时间戳并将结果除以86400(= 60 * 60 * 24)。因此,您不必考虑leap年。如果您的年龄为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等)进行一些调整。最后一点:我的代码并不完美解决方案,也许您会再考虑一下数据类型和舍入。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...