[英]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 tm
或struct tm *
變量執行此操作,但隨后會有很多追逐指針的操作。 鑒於將其轉換為time_t
非常容易,因此值得使用它代替它來避免麻煩。
希望這會有所幫助-在處理時間時,C ++顯然還有點不足。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.