【问题标题】:postgresql timestamp to std::chrono valuepostgresql 时间戳到 std::chrono 值
【发布时间】:2019-08-28 14:01:01
【问题描述】:

使用 c++ (libpqxx) 中的 postgresql 数据类型“没有时区的时间戳”的适当方法是什么?我还没有找到一种方法来做到这一点。 我仅限于 postgresql 中的“没有时区的时间戳”数据类型,并且环境正在运行 utc 时间。我希望找到到 std::chrono::system_clock::time_point 成员的映射,但我在 libpqxx 中找不到这样的。

//s有time_point var,r是pqxx::result,r[0]是明智的

s.creationtime = r[0]["creationtime"].as<std::chrono::system_clock::time_point>();

【问题讨论】:

    标签: postgresql timestamp libpqxx


    【解决方案1】:

    在 boost 的帮助下:

    s.creationtime = makeTimePoint(r[0]["creationtime"].as<string>());
    
    

    制作时间点:

    std::chrono::system_clock::time_point makeTimePoint(const std::string& s)
    {
      using namespace boost::posix_time;
      using namespace std::chrono;
    
      const ptime ts = time_from_string(s);
      auto seconds = to_time_t(ts);
      time_duration td = ts.time_of_day();
      auto microseconds = td.fractional_seconds();
      auto d = std::chrono::seconds{seconds} + std::chrono::microseconds{microseconds};
      system_clock::time_point tp{duration_cast<system_clock::duration>(d)};
      return tp;
    }
    
    

    【讨论】:

      【解决方案2】:

      C++20 规范引入了一系列 chrono::time_points,称为 local_time

      // [time.clock.local], local time
      struct local_t {};
      template<class Duration>
        using local_time  = time_point<local_t, Duration>;
      using local_seconds = local_time<seconds>;
      using local_days    = local_time<days>;
      

      这些time_points 代表“没有时区的时间戳”。

      这里有这个 C++20 库的免费、开源预览:

      https://github.com/HowardHinnant/date

      目前已被全球其他项目使用。该库与 C++20 规范相比有一些小的更改,例如将所有内容都放入 namespace date 而不是 namespace std::chrono

      使用此库的示例程序:

      #include "date/date.h"
      #include <iostream>
      
      int
      main()
      {
          using namespace date;
          using namespace std::chrono;
          int y = 2019;
          int m = 8;
          int d = 28;
          int H = 14;
          int M = 42;
          int S = 16;
          int US = 500'000;
          local_time<microseconds> lt = local_days{year{y}/m/d} + hours{H} +
                                        minutes{M} + seconds{S} + microseconds{US};
          std::cout << lt << '\n';
      }
      

      输出:

      2019-08-28 14:42:16.500000
      

      【讨论】:

        猜你喜欢
        • 2013-01-08
        • 1970-01-01
        • 2017-06-02
        • 1970-01-01
        • 2017-08-31
        • 1970-01-01
        • 2018-07-27
        • 2016-03-20
        • 1970-01-01
        相关资源
        最近更新 更多