【发布时间】:2016-04-23 08:42:20
【问题描述】:
我正在尝试计算 C 中两个时间点之间的差异,因为这些点在 1900 年之前,我需要使用负值。
虽然转换应该将变量jahr_tod_negative 写入ts.tm_year,但几乎每次我运行程序时,它都会给我一个完全不同的日期,甚至日期和月份都混淆了。年份是唯一需要为负的值。我怎样才能防止这种情况发生?
#include <stdio.h>
#include <time.h>
int main ()
{
time_t t;
struct tm ts;
char str[90];
int tag_tod;
int monat_tod;
int jahr_tod;
unsigned int jahr_tod_von_1900;
int jahr_tod_negative;
printf("Tag eingeben: ");
scanf("%d", &tag_tod);
printf("\nMonat eingeben: ");
scanf("%d", &monat_tod);
printf("\nJahr eingeben: ");
scanf("%d", &jahr_tod);
jahr_tod_von_1900 = 1900 - jahr_tod;
jahr_tod_negative = -jahr_tod_von_1900;
printf("jahr_tod_negative: %d\n", jahr_tod_negative);
//ts.tm_sec = 0;
//ts.tm_min = 0;
//ts.tm_hour = 0;
ts.tm_mday = tag_tod;
ts.tm_mon = monat_tod;
ts.tm_year = jahr_tod_negative; /* Jahr - 1900 */
//ts.tm_wday = 0;
//ts.tm_yday = 0;
//ts.tm_isdst = 0;
t = mktime(&ts);
//printf("%s", asctime(&ts));
printf("ts.tm_year: %d\n", ts.tm_year);
strftime(str, 90, "%d. %B %Y", &ts);
printf("Eingegebenes Datum: %s\n", str);
return 0;
}
【问题讨论】:
-
谁告诉你这应该有效?我完全不确定,但我担心它不能。
-
@jdarthenay 大约 4/10 次输出正确的值,另外 6 次似乎是随机的。
-
这很有趣。很高兴有机会 UPvote 改变问题:)
-
你能给出你正在使用的输入吗?如果您正在构建 32 位或 64 位程序,也很精确。
-
@jdarthenay 尝试输入:例如1456(有效),1568(随机数),每一个大于 1900 的数都输出正确的值。顺便说一句,它是 64 位。
标签: c time initialization undefined-behavior integer-overflow