我必须计算给定日期和现在之间的日期。我尝试过以下一段主要用于代码的代码。但是,它可以给出一个比当前日期提前几天或几个月的日期。 首先,它计算从现在到给定输入日期之间的年数。
问题在于,如果例如给定日期为1 March 1990
,则年份差异为25
。但这意味着随机日期也可以是1 March 2015 (1990 + 25)
,这是将来的(从今天开始看)。添加24
年将使最新的可能日期为31 December 2014
,这与今天的距离不够近。
所以在某个地方,我被困在计算适当的年数。有谁知道如何妥善解决这个问题?
PS告诉我是否需要更多代码,但所有输入都已正确完成并且包含了正确的库。
void random_func(struct tm *input_date, struct tm *random_date) {
struct tm now;
time_t date_now= time(NULL);
now = *localtime(&date_now);
int years_in_between;
years_in_between = difftime(now.tm_year + 1900, input_date->tm_year);
srand(time(0));
random_date->tm_mday = (rand() % 31) + 1;
random_date->tm_mon = (rand() % 12) + 1;
random_date->tm_year = input_date->tm_year + rand() % years_in_between;
tm_set_zero(random_date);
}
void tm_set_zero(struct tm *tmStruct) {
tmStruct->tm_sec = 0;
tmStruct->tm_min = 0;
tmStruct->tm_hour = 0;
tmStruct->tm_wday = 0;
tmStruct->tm_yday = 0;
tmStruct->tm_isdst = 0;
}
答案 0 :(得分:1)
这太复杂了。轻松完成任务:计算统一日期(类似于“1970-01-01以来经过的秒数”),计算两个日期之间的差异,得到一个随机数(模数为the_difference),将其添加到两个日期的较低位置
如果您必须管理类似于2000年5月21日的日期,那么创建一个统一日期的功能可能会成为一个挑战。但我猜一些谷歌搜索将揭示一个很好的算法。
答案 1 :(得分:1)
只需将time_t
视为整数,并计算过去和现在之间的随机整数,然后转换为时间。像这样:
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
time_t random_func(struct tm *input_date) {
time_t now = time(NULL);
time_t then = mktime(input_date);
time_t diff = now - then;
return then + time_t(diff * (double(rand()) / RAND_MAX));
}
int main() {
srand(time(NULL));
/* pick a date 1-year ago */
time_t inp_t = time(NULL) - (86400*365);
printf("inp_t %s", ctime(&inp_t));
struct tm* inp_tm = localtime(&inp_t);
time_t rnd_t = random_func(inp_tm);
printf("random %s", ctime(&rnd_t));
return 0;
}
答案 2 :(得分:0)
通过查找输入数据与现在之间的时间(以秒为单位)进行简化。将该差异缩放rand()/(RAND_MAX+1.0)
并将缩放差异应用于input_date
。
void random_func(struct tm *input_date, struct tm *random_date) {
// Convert time structure to a number
time_t input_time = mktime(input_date);
time_t now = time(NULL);
// Return difference in seconds.
double diff = difftime(now, input_time);
*random_date = *input_date;
diff *= rand()/(RAND_MAX + 1.0);
// struct tm fields are not limited to the primary range
random_date->tm_sec += (int) diff;
// mktime restores fields to primary range
mktime(random_date);
}
OP的代码difftime(now.tm_year + 1900, input_date->tm_year)
不正确。 difftime()
需要2 time_t
个参数。
C并未将time_t
定义为整数,也不将其定义为1970年1月1日以来的秒数 - 尽管这是常见做法。此代码不依赖于这两个假设。