如何将 dd-mmm-yyyy 和 now() 转换为天?

问题描述

我需要将 dd-mmm-year 字符串转换为纪元天数来做一些简单的数学运算。具体来说,计算从 now() 到字符串日期的天数。

我正在查看 <chrono><ctime>,但没有看到明显的方法?您如何将 dd-mmm-yearnow() 转换为纪元日?

解决方法

这可以通过 free,open-source,header-only preview of C++20 轻松完成,它适用于 C++11/14/17:

#include "date/date.h"
#include <iostream>
#include <sstream>

int
main()
{
    using namespace date;
    using namespace std;
    using namespace std::chrono;

    string s1 = "25-Mar-2021";
    string s2 = "20-Jul-2021";
    istringstream in{s1};
    in.exceptions(ios::failbit);
    sys_days t1;
    in >> parse("%d-%b-%Y",t1);
    in.str(s2);
    in.clear();
    sys_days t2;
    in >> parse("%d-%b-%Y",t2);
    cout << t2 - t1 << '\n';
}

sys_daysstd::chrono::time_point<system_clock,duration<int,ratio<86400>>> 的类型别名。但您可以将其视为自 1970-01-01 以来的天数。

上面的程序输出:

117d

表达式 t2 - t1 的类型是 std::chrono::duration<int,ratio<86400>>

Here is a live example 你可以尝试。

编辑:

您可以使用 t2 - t1 成员函数将持续时间(例如 .count())转换为有符号整数类型:

auto i = (t2 - t1).count();  // 117

另一种方法是除以days{1}

auto i = (t2 - t1)/days{1};  // 117

后一种技术给那些了解维度分析的人一种温暖的模糊感觉。 :-)

您可以像这样将 std::chrono::system_clock::now() 转换为类型 sys_days

auto t2 = floor<days>(system_clock::now());

这会根据 UTC 给出当前日期。如果您需要根据某个其他时区(例如计算机的本地时区设置)的当前日期,那么这涉及一个 additional library (at the same link),它不是仅标头而是涉及 some installation。在那种情况下,可以使用 local_days 而不是 sys_days

#include "date/tz.h"
#include <iostream>
#include <sstream>

int
main()
{
    using namespace date;
    using namespace std;
    using namespace std::chrono;

    string s1 = "25-Mar-2021";
    istringstream in{s1};
    in.exceptions(ios::failbit);
    local_days t1;
    in >> parse("%d-%b-%Y",t1);
    auto t2 = floor<days>(current_zone()->to_local(system_clock::now()));
    cout << t2 - t1 << '\n';
}

输出(当前):

1d

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...