c ++将没有时区的postgres时间戳转换为time_t

时间:2014-03-05 20:53:13

标签: c++ postgresql

我正在使用libpq库从c ++连接到postgreSQL。我从postgreSQL请求并获取日期(没有时区的时间戳),但结果有一个我不知道如何解决的偏移量。

Postgres表:

id               date
integer          timestamp without time zone
29996            2014-02-28 23:59:00

导致C ++代码:

id: 29996, Date: Sat Mar 01 10:59:00 2014

您可以看到日期有偏移量。下面是我正在使用的代码。任何帮助将不胜感激

PGconn *m_connection;
PGresult *res;

string strConn = "dbname=test host=localhost user=username password=secret";
m_connection = PQconnectdb(strConn.c_str());

string query = "SELECT id, extract(epoch from date)::bigint ";     
query += "FROM table_test ORDER BY id DESC LIMIT 1";

// send query
res = PQexecParams(m_connection, query.c_str(), 0, 0, 0, 0, 0, 0);

string id = PQgetvalue(res, 0, 0);

unsigned char *data = (unsigned char*)PQgetvalue( res, 0, 1 );
unsigned int length = PQgetlength( res, 0 , 1 );
time_t time = _atoi64( (char*)data );

PQclear(res);   


std::cout << "id:"<< id << ", Date: " << ctime(&time) << "\n";

1 个答案:

答案 0 :(得分:1)

问题是ctime使用了localtime,因此最终会出现偏移量。

如果你想要GMT,那么你应该使用asctime(gmtime(&time)),它会给你一个没有当地时间影响的日期/时间。

ctime相当于asctime(localtime(&time))