如何将 dd-mmm-yyyy 和 now() 转换为天数?
How to convert dd-mmm-yyyy and now() to days?
我需要将 dd-mmm-year
字符串转换为纪元日来做一些简单的数学运算。具体计算now()
到字符串日期
的天数
我正在查看 <chrono>
和 <ctime>
,但我没有看到一个明显的方法来做到这一点?如何将 dd-mmm-year
和 now()
转换为纪元日?
这可以用这个 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_days
是 std::chrono::time_point<system_clock, duration<int, ratio<86400>>>
的类型别名。但您可以将其视为自 1970 年 1 月 1 日以来的天数。
上面的程序输出:
117d
表达式t2 - t1
的类型是std::chrono::duration<int, ratio<86400>>
。
Here is a live example你可以试试。
编辑:
您可以使用 .count()
成员函数将持续时间(例如 t2 - t1
)转换为有符号整数类型:
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) which is not header-only and involves 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
我需要将 dd-mmm-year
字符串转换为纪元日来做一些简单的数学运算。具体计算now()
到字符串日期
我正在查看 <chrono>
和 <ctime>
,但我没有看到一个明显的方法来做到这一点?如何将 dd-mmm-year
和 now()
转换为纪元日?
这可以用这个 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_days
是 std::chrono::time_point<system_clock, duration<int, ratio<86400>>>
的类型别名。但您可以将其视为自 1970 年 1 月 1 日以来的天数。
上面的程序输出:
117d
表达式t2 - t1
的类型是std::chrono::duration<int, ratio<86400>>
。
Here is a live example你可以试试。
编辑:
您可以使用 .count()
成员函数将持续时间(例如 t2 - t1
)转换为有符号整数类型:
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) which is not header-only and involves 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