生成日期向量使用<ctime>

Generate a date vector using <ctime>

本文关键字:lt ctime gt 日期 向量      更新时间:2023-10-16

如何使用库构建一个包含两个给定日期之间所有日期(每日周期<ctime>向量? 例如,给定 2019 年 1 月 1 日和 2019 年 1 月 10 日,包含介于两者之间的 10 个日期(含)的向量?

我真的不介意日期的表示,可以是字符串或任何其他结构,但我想了解如何操作<ctime>对象。

如果在C++中有一个更好的时间表示库,我会很高兴听到它。

使用 C++20 日期库(又名 Howard Hinnant 的日期库):

#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;
}

(现场演示)

这是一个小型的快速演示程序 - 它制作一个struct tm向量,然后打印超时。矢量的每个新条目都比旧条目早一天,在经过它们时无缝地环绕数月和数年。

时间通常存储在一个time_t中,这是自y2k以来的秒数。这种数据类型似乎比struct tm更容易操作 - 我们将使用它,再加上一天中的秒数,随时创建struct tm向量。我们将从 time0 开始,然后继续 20 天到 time19,为我们计算的每一天添加一个新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 / %yn", &tim);
puts(buffer);
}

return 0;
}

请注意,for 循环按一天中的秒数递增。可能可以直接使用struct tmstruct tm *变量来执行此操作,但是接下来会有很多追逐指针。鉴于它很容易转换为time_t,使用它可能值得省去头痛。

希望这有所帮助 - 诚然C++处理时间时还有一些不足之处。