首页 > 解决方案 > postgresql 时间戳到 std::chrono 值

问题描述

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

//s 有一个 time_point 变量,r 是一个 pqxx::result,r[0] 是合理的

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

标签: postgresqltimestamplibpqxx

解决方案


chrono::time_pointC++20 规范引入了一个叫做 s的家族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

推荐阅读