c++ 我怎样才能找到两个日期之间的天数[duplicate]

t3irkdon  于 2022-12-15  发布在  其他
关注(0)|答案(2)|浏览(162)

此问题在此处已有答案

Number of days between two dates C++(5个答案)
How to calculate how many days between two dates in c++ visual studio?(1个答案)
3天前关闭.

class Solution {
public:
    int daysBetweenDates(string date1, string date2) {
        
    }
};

我有这个函数。假设我有参数

date1 = "2020-01-15", date2 = "2019-12-31"

我怎样才能找到这两个日期之间的天数?

pgccezyw

pgccezyw1#

一旦解析了日期并提取了相应的月、日、年信息,就可以使用<chrono>头来查找天数差异:

// https://godbolt.org/z/hfM8YWze5

#include <chrono>
#include <iostream>

int main() {
    using namespace std::chrono;
    auto tp1 = sys_days{January / 15 / 2020};
    auto tp2 = sys_days{December / 31 / 2019};

    std::cout << (tp1 - tp2) << '\n'; // 15d
}

示例:

// https://godbolt.org/z/bo68T5T39

#include <chrono>
#include <iostream>
#include <sstream>
#include <string>

std::chrono::sys_days parse_time(const std::string& time) {
    std::chrono::sys_days days;
    std::istringstream stream{time};
    stream.exceptions(std::ios_base::badbit | std::ios_base::failbit);
    from_stream(stream, "%Y-%2m-%2d", days);
    return days;
}

int main() {
    const auto tp1 = parse_time("2020-01-15");
    const auto tp2 = parse_time("2019-12-31");
    std::cout << (tp1 - tp2) << '\n';  // 15d
}
vxqlmq5t

vxqlmq5t2#

或者,C++20之前的解决方案可以是:

#include <iostream>
#include <chrono>

int main()
{
    std::string date1 = "2020-01-15";
    std::tm tm1 = {};
    strptime(date1.c_str(), "%Y-%m-%d", &tm1);
    auto tp1 = std::chrono::system_clock::from_time_t(std::mktime(&tm1));
    
    std::string date2 = "2019-12-31";
    std::tm tm2 = {};
    strptime(date2.c_str(), "%Y-%m-%d", &tm2);
    auto tp2 = std::chrono::system_clock::from_time_t(std::mktime(&tm2));
    
    std::chrono::system_clock::duration d = tp1 - tp2;
    using DayLength = std::chrono::duration<int,std::ratio<60*60*24>>;
    DayLength days = std::chrono::duration_cast<DayLength> (d);
    
    std::cout << days.count() << std::endl;

    return 0;
}

如果不使用C++20 std::chrono::sys_days,我无法充分理解上面的日期提取操作有多么复杂。
基本上,它进行以下转换:字符串-〉C字符串-〉struct tm -〉time_point -〉持续时间(以时段为单位)-〉持续时间(以天为单位)-〉用于打印的算术类型

相关问题