Slu*_*Pue 0 c++ date c++-chrono
假设我们有一个表示日期的整数,格式为 20160120。我想将其转换为自纪元 (1970-01-01) 以来的天数,以便它对应于 POSIX 样式的日期。例如,int 20160718 将变为 int 17000。
\n\n我的尝试如下,我首先将 int 转换为字符串,然后转换为纪元以来的秒数,然后转换为纪元以来的天数。这样做的一个问题是我必须将日期移动 3 小时才能获得正确的日期(请参阅std::to_string(d*100 + 3))行。我怀疑这与时区有关?我在 UTC - 1。我不知道如何处理这个问题。
所以我想知道是否有一种不太复杂的方法来做到这一点,如果没有\xe2\x80\x93 我如何解决时区问题。
\n\n#include <iostream>\n#include <chrono>\n#include <time.h>\n#include <iomanip>\n#include <sstream>\n#include <string>\n\ntypedef std::chrono::duration<int, std::ratio<60 * 60 * 24>> days_type;\ntypedef std::chrono::system_clock sysclock;\n\nint convert(const unsigned d){\n std::tm t = {};\n std::istringstream ss(std::to_string(d*100 + 3)); \n ss >> std::get_time(&t, "%Y%m%d%H");\n\n time_t t_ = mktime(&t);\n\n /*\n Now convert seconds since epoch to days since epoch via chrono...\n */\n\n sysclock::time_point tp = sysclock::from_time_t(t_);\n\n std::chrono::time_point<sysclock, days_type> tp_day = \n std::chrono::time_point_cast<days_type>(tp);\n\n return tp_day.time_since_epoch().count();\n}\n\n\nint main(){\n int d = 20160718;\n std::cout << d << ": " << convert(d) << std::endl; //17000\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n
使用日期库:
#include "date.h"
#include <iostream>
int convert(unsigned d) {
date::year_month_day ymd{date::year(d / 100 / 100),
date::month(d / 100 % 100), date::day(d % 100)};
return date::sys_days{ymd}.time_since_epoch().count();
}
int main() {
int d = 20160718;
std::cout << d << ": " << convert(d) << '\n'; // 17000
}
Run Code Online (Sandbox Code Playgroud)
当然,convert()API 可以通过更强的类型来改进,例如直接返回 adate::sys_days来表示时间点。
| 归档时间: |
|
| 查看次数: |
1605 次 |
| 最近记录: |