计算C中两个日期的天数差异
calculate the difference in days from two dates in C
我的代码有问题:我需要计算两个日期之间的时差。我在结构中有日期。
为什么结果是0?我在这里被封锁了 2 天。
typedef struct {
int day;
int month;
int year;
} DIAGNOSISDATE;
DIAGNOSISDATE dateDiagnosis[3];
typedef struct {
int day;
int month;
int year;
} HEALINGDATE;
HEALINGDATE dateHealing[3];
typedef struct {
char firstName[20];
char lastName[20];
char fiscalCode[17];
STATESICK stateSick;
DIAGNOSISDATE dateDiagnosis;
HEALINGDATE dateHealing;
} SICKREGION;
SICKREGION sickregion[SIZESICK];
我在这里有我的功能:
void timeDiff() {
struct tm ts;
char buf[80];
//int getTimeDiff = 0;
long total = 0;
int i = 0;
int k = 0;
int j = 0;
for (i = 0; i < 1; i++) {
for (j = 0; j < 1; j++) {
for (k = 0; k < 3; k++) {
struct tm time1;
time1.tm_mday = region[i].hospital[j].sickregion[k].dateHealing.day;
time1.tm_mon = region[i].hospital[j].sickregion[k].dateHealing.month;
time1.tm_year = region[i].hospital[j].sickregion[k].dateHealing.year;
struct tm time0;
time0.tm_mday = region[i].hospital[j].sickregion[k].dateDiagnosis.day;
time0.tm_mon = region[i].hospital[j].sickregion[k].dateDiagnosis.month;
time0.tm_year = region[i].hospital[j].sickregion[k].dateDiagnosis.year;
time_t rawtime = difftime(mktime(&time1), mktime(&time0));
// Total = (Total + rawtime);
ts = *localtime(&rawtime);
//Total = (rawtime + Total) + 1;
total += (rawtime / 86400);
}
}
}
strftime(buf, sizeof(buf), "%j", &ts);
// printf("%s\n", buf);
printf("%ld\n", total);
}
我不明白问题出在哪里。
无论如何,在我的 macbook 中它将 运行,在 windows 中不起作用。 :/
代码是一样的。
我试图在我的 typedef 中对 the struct tm
0 and struct tm 1
进行二分法运算,但没有任何区别。有人知道问题出在哪里吗?
您的代码有未定义的行为,因为您没有初始化 tm_time1
和 tm_time2
的其他成员。一个快速解决方法是:
struct tm time1 = { 0 };
struct tm time2 = { 0 };
另一个问题是您将 double
类型的 difftime
的 return 值存储到 time_t
变量中。时间差可能是负数,time_t
可能是无符号类型,导致 rawtime / 86400
产生一个大的正数。您可能应该使用 long
来存储时差,如果该时差为负则拒绝数据。
解决此问题后,long rawtime = difftime(mktime(&time1), mktime(&time0));
将计算上午 0:00:00 两个日期之间的时差(以秒为单位)。
将此除以 86400
并不完全正确,因为如果在间隔中由于 DST 而导致一个或多个本地时间更改,则差异可能不是 86400 的精确倍数。我建议你使用:
total += (rawtime + 3600 * 3) / 86400; // difference in days, ignoring DST.
或者,您可以将 rawtime
定义为 double
并使用:
total += round(rawtime / 86400.0);
最后,计算 ts = *localtime(&rawtime);
毫无意义:只有当秒数代表有效日期时,将秒数转换为日期才有意义。 rawtime
是持续时间,不是有效日期。
我的代码有问题:我需要计算两个日期之间的时差。我在结构中有日期。
为什么结果是0?我在这里被封锁了 2 天。
typedef struct {
int day;
int month;
int year;
} DIAGNOSISDATE;
DIAGNOSISDATE dateDiagnosis[3];
typedef struct {
int day;
int month;
int year;
} HEALINGDATE;
HEALINGDATE dateHealing[3];
typedef struct {
char firstName[20];
char lastName[20];
char fiscalCode[17];
STATESICK stateSick;
DIAGNOSISDATE dateDiagnosis;
HEALINGDATE dateHealing;
} SICKREGION;
SICKREGION sickregion[SIZESICK];
我在这里有我的功能:
void timeDiff() {
struct tm ts;
char buf[80];
//int getTimeDiff = 0;
long total = 0;
int i = 0;
int k = 0;
int j = 0;
for (i = 0; i < 1; i++) {
for (j = 0; j < 1; j++) {
for (k = 0; k < 3; k++) {
struct tm time1;
time1.tm_mday = region[i].hospital[j].sickregion[k].dateHealing.day;
time1.tm_mon = region[i].hospital[j].sickregion[k].dateHealing.month;
time1.tm_year = region[i].hospital[j].sickregion[k].dateHealing.year;
struct tm time0;
time0.tm_mday = region[i].hospital[j].sickregion[k].dateDiagnosis.day;
time0.tm_mon = region[i].hospital[j].sickregion[k].dateDiagnosis.month;
time0.tm_year = region[i].hospital[j].sickregion[k].dateDiagnosis.year;
time_t rawtime = difftime(mktime(&time1), mktime(&time0));
// Total = (Total + rawtime);
ts = *localtime(&rawtime);
//Total = (rawtime + Total) + 1;
total += (rawtime / 86400);
}
}
}
strftime(buf, sizeof(buf), "%j", &ts);
// printf("%s\n", buf);
printf("%ld\n", total);
}
我不明白问题出在哪里。
无论如何,在我的 macbook 中它将 运行,在 windows 中不起作用。 :/
代码是一样的。
我试图在我的 typedef 中对 the struct tm
0 and struct tm 1
进行二分法运算,但没有任何区别。有人知道问题出在哪里吗?
您的代码有未定义的行为,因为您没有初始化 tm_time1
和 tm_time2
的其他成员。一个快速解决方法是:
struct tm time1 = { 0 };
struct tm time2 = { 0 };
另一个问题是您将 double
类型的 difftime
的 return 值存储到 time_t
变量中。时间差可能是负数,time_t
可能是无符号类型,导致 rawtime / 86400
产生一个大的正数。您可能应该使用 long
来存储时差,如果该时差为负则拒绝数据。
解决此问题后,long rawtime = difftime(mktime(&time1), mktime(&time0));
将计算上午 0:00:00 两个日期之间的时差(以秒为单位)。
将此除以 86400
并不完全正确,因为如果在间隔中由于 DST 而导致一个或多个本地时间更改,则差异可能不是 86400 的精确倍数。我建议你使用:
total += (rawtime + 3600 * 3) / 86400; // difference in days, ignoring DST.
或者,您可以将 rawtime
定义为 double
并使用:
total += round(rawtime / 86400.0);
最后,计算 ts = *localtime(&rawtime);
毫无意义:只有当秒数代表有效日期时,将秒数转换为日期才有意义。 rawtime
是持续时间,不是有效日期。