繁体   English   中英

使用生成日期向量<ctime>

[英]Generate a date vector using <ctime>

如何使用<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向量。 我们将从时间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 ++显然还有点不足。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM