使用<ctime>生成日期向量

时间:2019-07-24 23:40:20

标签: c++ datetime c++17

如何使用<ctime>库构建一个包含两个给定日期之间所有日期(每日时间段)的向量?例如,在给定2019年1月1日至2019年1月10日的情况下,一个向量包含介于(包括)之间的10个日期?

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

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

2 个答案:

答案 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;
}

live demo

答案 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 tmstruct tm *变量来执行此操作,但随后会有很多追逐指针的操作。鉴于转换为time_t非常容易,所以值得使用它来代替它。

希望这会有所帮助-在处理时间时,C ++显然还有点不足。