如何使用<ctime>
库构建一个包含两个给定日期之间所有日期(每日时间段)的向量?例如,在给定2019年1月1日至2019年1月10日的情况下,一个向量包含介于(包括)之间的10个日期?
我不太介意日期的表示形式,可以是字符串或任何其他结构,但是我想了解如何操作<ctime>
对象。
如果有一个更好的C ++时间表示库,我将很高兴听到它。
答案 0 :(得分:3)
使用C ++ 20日期库(也称为Howard Hinnant's date library):
#include "date.h"
auto get_dates(date::sys_days first, date::sys_days last)
{
std::vector<date::sys_days> dates;
for (; first <= last; first += date::days{1})
dates.push_back(first);
return dates;
}
答案 1 :(得分:1)
这是一个小型,快速的演示程序-它生成struct tm
的向量,然后显示超时。向量中的每个新条目都比旧条目早一天,随着滚动经过它们,它们无缝地环绕了数月和数年。
时间通常存储在time_t
中,这是自y2k以来的秒数。这种数据类型似乎比struct tm
更易于操作-我们将使用它以及一天中有几秒钟的时间来创建struct tm
的向量。我们将从时间0开始,并且将继续20天,直到时间19,为我们计算的每一天添加一个新的struct tm
。
#include <iostream>
#include <ctime>
#include <vector>
int main(void) {
double secs_in_a_day = 86400;
time_t time0; //your start time here
time(&time0); //i'm using the current time
//20 days later
time_t time19 = time0 + (20 * secs_in_a_day); //your end time here
std::vector<struct tm > timevec;
for(time_t i = time0; i <= time19; i += secs_in_a_day) {
struct tm t = *(gmtime(&i));
std::cout << i << "\n";
timevec.push_back(t);
}
char buffer[80];
for(struct tm tim : timevec) {
strftime(buffer, 80, "Time: %d / %m / %y\n", &tim);
puts(buffer);
}
return 0;
}
请注意,for循环以一天中的秒数递增。可能可以直接使用struct tm
或struct tm *
变量来执行此操作,但随后会有很多追逐指针的操作。鉴于转换为time_t
非常容易,所以值得使用它来代替它。
希望这会有所帮助-在处理时间时,C ++显然还有点不足。