首先,让我们更改语法并将问题分开,因为我可以看到有 3 个问题。
第一个语法convert_tz
接受一个字符串,调用应如下所示:
select convert_tz('2011-06-30 09:00:00','GMT','IST')
单引号而不是双引号。
第二。如果您的计算机位于同一时区并且您运行在 POSIX 兼容系统上,您可以获得表示日期的字符串并执行以下操作:
struct tm result;
strptime(<time string>, <format string>, &result);
time_t epoch_time = mktime(&result);
这将为您提供标准 UNIX 时间,然后您可以使用它来执行您需要的任何操作。
最后但并非最不重要的一点是提升。可以肯定的是,它是一个功能强大的库,但我认为对于该项目,您此时不需要增加它的复杂性。如果您仍然想尝试一下或者您没有使用 POSIX 兼容系统,您可以看看http://www.boost.org/doc/libs/1_48_0/doc/html/date_time.html http://www.boost.org/doc/libs/1_48_0/doc/html/date_time.html,您仍然需要创建它ptime
从您从数据库返回的字符串中获取,然后按照您认为合适的方式对其进行操作。使用local_time
部分根据需要创建时区对象,然后根据它检查从数据库获取的时间。您可以查看中的示例http://www.boost.org/doc/libs/1_48_0/doc/html/date_time/examples/general_usage_examples.html http://www.boost.org/doc/libs/1_48_0/doc/html/date_time/examples/general_usage_examples.html
尤其是最后一张。所以对于你的例子来说它将是:
time_zone_ptr src_zone(new posix_time_zone("IST+05:30:00"));
time_zone_ptr dst_zone(new posix_time_zone("CST"));
local_date_time trd_time(date(....), hours(...), src_zone,
local_date_time::NOT_DATE_TIME_ON_ERROR);
local_date_time res_time = trd_time.local_time_in(dst_zone);
不能保证它 100% 正确,但你明白了。
Example:
#include "boost/date_time/local_time/local_time.hpp"
#include <iostream>
int main()
{
using namespace boost::posix_time;
using namespace boost::gregorian;
using namespace boost::local_time;
tz_database tz_db;
time_zone_ptr chi_tz(new posix_time_zone("CST-06:00:00");
time_zone_ptr jst_tz(new posix_time_zone("JST+09:00:00"));
local_date_time jpn_time(date(2012,Jan,3), hours(16),
chi_tz,local_date_time::NOT_DATE_TIME_ON_ERROR);
local_date_time osaka_time = jpn_time.local_time_in(jst_tz);
std::cout<<"osaka_time: "<<osaka_time<<std::endl;
return 0;
}