我有一些任务要做一个比较两个日期的C程序,并返回它们之间的天数。
问题是,变量的标识符应该是time.h库中的一个,因此我不能对这两个日期使用字符串或整数。 我知道time.h中的变量有time_t标识符,但是如何继续询问用户输入该类型的变量?我不知道我应该在printf或scanf中放入什么样的这种类型。另外,有什么方法可以检查用户输入是否有效?
为了比较这两个,我想我应该使用也包含在time.h中的difftime()函数,但是再次,我不确定。我在某个地方看到它显示的差异在几秒钟内,不确定该来源是否合法,但我并不真的需要它。我需要几天,因为我正在处理日期。
网上搜索的内容不多,这就是我寻求帮助的原因。提前谢谢!
答案 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
如果您有任何问题,请与我们联系。