C++:将 20160120 形式的日期转换为自纪元以来的天数

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。我不知道如何处理这个问题。

\n\n

所以我想知道是否有一种不太复杂的方法来做到这一点,如果没有\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}\n
Run Code Online (Sandbox Code Playgroud)\n

bam*_*s53 5

使用日期库

#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来表示时间点。

  • +1 这个答案的表现将围绕其他答案运行。如果您讨厌使用这个开源代码,您可以从这里获取它使用的算法:http://howardhinnant.github.io/date_algorithms.html#days_from_civil 并自己编写代码。 (3认同)