C

时间:2016-05-18 21:02:12

标签: c date comparison time.h

我有一些任务要做一个比较两个日期的C程序,并返回它们之间的天数。

问题是,变量的标识符应该是time.h库中的一个,因此我不能对这两个日期使用字符串或整数。 我知道time.h中的变量有time_t标识符,但是如何继续询问用户输入该类型的变量?我不知道我应该在printf或scanf中放入什么样的这种类型。另外,有什么方法可以检查用户输入是否有效?

为了比较这两个,我想我应该使用也包含在time.h中的difftime()函数,但是再次,我不确定。我在某个地方看到它显示的差异在几秒钟内,不确定该来源是否合法,但我并不真的需要它。我需要几天,因为我正在处理日期。

网上搜索的内容不多,这就是我寻求帮助的原因。提前谢谢!

3 个答案:

答案 0 :(得分:0)

类型time_t只是秒的计数器。您想将其转换为struct tm*来电localtime(time_t*)char *ctime(time_t*)将为您提供字符串表示形式。对于格式化的输入和输出,您必须自己与struct tm的个人成员合作。

答案 1 :(得分:0)

我假设你只想要两个日期之间的天数(而不是时间)。如其中一条评论中所述,选择您想要的任何格式的用户输入,然后解析它。

要求作为日期输入的最简单格式之一是yyyymmdd形式的整数。

例如,如果我想查找从今年(2016年5月27日)到独立日(7月4日)的生日天数,我将进入20160527和20160704计划。

作为整数,这些相对容易转换为月,日和年。

声明一个struct tm并设置每个月的日期和年份:

// Lets say the above dates were read into integers indate1 and indate2,
// so indate1 = 20160527 and indate2 = 20160704

#include <time.h>

struct tm dt = {0};
dt.tm_year = (indate1/10000) - 1900;
dt.tm_mon  = (indate1/100)%100;
dt.tm_mday = (indate1%100);

// Now convert to time_t:
time_t dt1 = mktime(&dt);

// Now do the same for indate2:
dt.tm_year = (indate2/10000) - 1900;
dt.tm_mon  = (indate2/100)%100;
dt.tm_mday = (indate2%100);
time_t dt2 = mktime(&dt);

// Now take the difference between the two dates:
double seconds = difftime( dt2, dt1 );

// Now convert to number of days:
unsigned long days = ( seconds / (60*60*24) );
fprintf( stdout, "The number of days between those two dates is %ld\n", days);

答案 2 :(得分:0)

除了根据整数输入手动打包struct tm之外,您还可以使用string直接使用strptime输入。 strptime会根据提供的struct tm字符串将作为第一个参数提供的字符串转换为format

根据您正在处理的输入类型,您可能会发现这更方便。一个简短的例子是:

#define _XOPEN_SOURCE

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

int main (int argc, char **argv) {

    char *dtstr1 = argc > 1 ? argv[1] : "20160527";
    char *dtstr2 = argc > 2 ? argv[2] : "20160704";
    struct tm dt = {0};
    time_t dt1 = 0, dt2 = 0;

    /* convert input strings to struct tm */
    strptime (dtstr2, "%Y%m%d", &dt);    
    dt2 = mktime (&dt);

    strptime (dtstr1, "%Y%m%d", &dt);    
    dt1 = mktime (&dt);

    /* get difference in calendar time */
    double seconds = difftime (dt2, dt1);

    /* convert to number of days */
    long days = (seconds/(60*60*24));

    if (seconds < 0) /* output difference with occurrence orientation */
        printf ("%s occurs %ld days after %s\n", dtstr1, -days, dtstr2);
    else if (seconds > 0)
        printf ("%s occurs %ld days before %s\n", dtstr1, days, dtstr2);
    else
        printf ("%s and %s are contemporaneous\n", dtstr1, dtstr2);

    return 0;
}

注意:,但不太可能,您可以检查days转化中的溢出)

示例使用/输出

$ ./bin/time_diff_days
20160527 occurs 38 days before 20160704

$ ./bin/time_diff_days 20160101 20150101
20160101 occurs 365 days after 20150101

$ ./bin/time_diff_days 20150101 20150101
20150101 and 20150101 are contemporaneous

如果您有任何问题,请与我们联系。