【发布时间】:2017-10-19 08:04:10
【问题描述】:
我已经构建了一个函数,该函数将特定日期作为输入并以std::chrono::milliseconds 格式返回该日期。
milliseconds lowerRangeBound = TimeStamp(mm, dd, HH, MM, SS, yyyy);
例如,
milliseconds a = TimeStamp(8/*month*/, 23/*day*/, 14/*hours*/, 46/*minutes*/, 32/*seconds*/, 2017/*year*/);
以转换后的字符串格式返回:2017.08.23-14.46.32
我现在想做但不工作的是给定两个日期 (milliseconds) 以在这两个日期定义的范围内随机取一个日期。例如,给定
milliseconds a = TimeStamp(8/*month*/, 23/*day*/, 13/*hours*/, 46/*minutes*/, 32/*seconds*/, 2017/*year*/);
milliseconds b = TimeStamp(10/*month*/, 23/*day*/, 13/*hours*/, 46/*minutes*/, 32/*seconds*/, 2017/*year*/);
预期的输出是milliseconds c,它的字符串格式是这样的日期,2017.09.13-12.56.12。请注意,所需的输出是milliseconds,提供字符串格式以便在readable format 中发言。
到目前为止,我尝试将每个 milliseconds 变量转换为 long 数字 (.count()) 并在 [a,b] 范围内获得 random long。但是,输出日期无关紧要:1977.12.06-16.27.02。
您能帮帮我吗?
提前谢谢你。
编辑:下面的代码受到link的启发
milliseconds TimeStamp(int mm, int dd, int HH, int MM, int SS, int yyyy) {
tm ttm = tm();
ttm.tm_year = yyyy - 1900; // Year since 1900
ttm.tm_mon = mm - 1; // Month since January
ttm.tm_mday = dd; // Day of the month [1-31]
ttm.tm_hour = HH; // Hour of the day [00-23]
ttm.tm_min = MM;
ttm.tm_sec = SS;
time_t ttime_t = mktime(&ttm);
system_clock::time_point time_point_result = std::chrono::system_clock::from_time_t(ttime_t);
milliseconds now_ms = std::chrono::time_point_cast<std::chrono::milliseconds>(time_point_result).time_since_epoch();
return now_ms;
}
milliseconds getRandomTimestamp(int mm_1, int dd_1, int HH_1, int MM_1, int SS_1, int yyyy_1,
int mm_2, int dd_2, int HH_2, int MM_2, int SS_2, int yyyy_2, int N) {
milliseconds lowerRangeBound = fixedTimeStamp(mm_1, dd_1, HH_1, MM_1, SS_1, yyyy_1);
milliseconds upperRangeBound = fixedTimeStamp(mm_2, dd_2, HH_2, MM_2, SS_2, yyyy_2);
long lowerRange_ = lowerRangeBound.count();
long upperRange_ = upperRangeBound.count();
//long output = rand() % (upperRange_ - lowerRange_ + 1) + lowerRange_;
// rand() replaced after @Jarod42's suggestion.
std::default_random_engine generator;
std::uniform_int_distribution<int> distribution(lowerRange_, upperRange_);
long output = distribution(generator);
std::chrono::duration<long> dur(output);
return dur;
}
【问题讨论】:
-
什么你试过了吗?请向我们展示它的Minimal, Complete, and Verifiable Example,而不仅仅是描述它。
-
题外话:
myTimeStamp(8, 23, 13, 46, 32, 2017);是一个可怕的、令人头疼的、容易出错的设计 -
rand()可以替换为<random>中的内容。 -
如果
millisecond计数不能存储在long中会怎样?请记住,long不是固定大小的整数类型,它可以是 32 位或 64 位长。 -
实际上更糟的是,您的
std::uniform_int_distribution使用int,我从未见过64 位。在您的getRandomTimestamp函数中,将long类型更改为auto,并使用例如std::uniform_int_distribution<decltype(lowerRange_)>代替。另外,return milliseconds(output)