2013-05-30 85 views
1

我正在阅读来自PostgreSQL数据库的时间戳字段。如何强制boost :: posix_time识别时区?

my_timestamp TIMESTAMP WITH TIME ZONE DEFAULT NOW() 

从数据库中读取数据时,我将其转换为升压时间戳是这样的::

boost::posix_time::ptime pt(boost::posix_time::time_from_string(str)); 

这个问题似乎是boost::posix_time::time_from_string()忽略了时区的时间戳列定义。

例如:

database text string == "2013-05-30 00:27:04.8299-07" // note -07 timezone 
boost::posix_time::to_iso_extended_string(pt) == "2013-05-30T00:27:04.829900" 

当我用所得的ptime对象算术,时间是关闭的恰好7小时。有没有更好的我应该做的,不要失去时区信息?

回答

1

我想你应该使用boost :: local_date_time来处理时区。在文档中有一个例子与您正在尝试执行的操作非常相似:http://www.boost.org/doc/libs/1_41_0/doc/html/date_time/examples.html#date_time.examples.seconds_since_epoch

编辑: Boost支持使用特定格式的日期分析。 http://www.boost.org/doc/libs/1_40_0/doc/html/date_time/date_time_io.html#date_time.format_flags

string inp("2013-05-30 00:27:04.8299-07"); 
string format("%Y-%m-%d %H:%M:%S%F%Q"); 
date d; 
d = parser.parse_date(inp, 
         format, 
         svp); 
// d == 2013-05-30 00:27:04.8299-07 
+0

我不跟着你。如何将带时区信息的文本字符串转换为boost :: local_date_time?我看到接受一个字符串的唯一函数是boost :: posix_time :: time_from_string(),它似乎放弃了时区信息。 –

+0

检查我的编辑,请看 –

+0

我知道你从boost文档中获得了哪些内容,但我无法弄清楚如何使其工作。 svp参数来自哪里?来自Boost的示例仅显示此分析日期,而不是时间戳。 –

相关问题