计算C中2个给定日期之间的随机日期

时间:2015-02-01 21:29:27

标签: c date random time struct

我必须计算给定日期和现在之间的日期。我尝试过以下一段主要用于代码的代码。但是,它可以给出一个比当前日期提前几天或几个月的日期。 首先,它计算从现在到给定输入日期之间的年数。

问题在于,如果例如给定日期为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;
}

3 个答案:

答案 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日以来的秒数 - 尽管这是常见做法。此代码不依赖于这两个假设。