gpt4 book ai didi

c++ - 在 C++/boost 中将日期时间转换为不同的时区

转载 作者:可可西里 更新时间:2023-11-01 08:37:10 27 4
gpt4 key购买 nike

我有印度股票市场的价格数据,但上面的时间和日期戳是 GMT,所以我可以使用表示正确日期和时间的数据。

我需要将数据库中某些记录的日期和时间从 GMT(我当前的时区)转换为 IST。

mysql> desc price_hist;
+---------------+-----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+-----------------------+------+-----+---------+----------------+
| trade_id | int(11) | NO | PRI | NULL | auto_increment |
| contract_name | varchar(14) | NO | MUL | NULL | |
| trade_date | date | NO | | NULL | |
| trade_time | varchar(6) | NO | | NULL | |
| trade_price | decimal(10,4) | NO | | NULL | |
| trade_volume | bigint(20) | NO | | NULL | |
+---------------+-----------------------+------+-----+---------+----------------+
8 rows in set (0.02 sec)

我试图通过运行来更改数据库本身的时区,但这没有用:

select convert_tz("2010-06-30 19:00:00",'GMT','IST');
+-----------------------------------------------+
| convert_tz("2011-06-30 09:00:00",'GMT','IST') |
+-----------------------------------------------+
| NULL |
+-----------------------------------------------+
1 row in set (0.01 sec)

我是 Boost 的新手,但有人建议我在代码本身中使用 Boost 日期来处理这个问题。

我搜索了一些关于日期时间转换的帖子,但没有找到可以回答我的具体问题的帖子。

如果有特定链接或更好的链接,例如某人可以分享的 boost 代码,这对于像我这样的 nubee 来说将是一个很好的开始。 :-)

我使用@Karison提供的引用编写了如下代码:

#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=tz_db.time_zone_from_region("America/Chicago");
time_zone_ptr jst_tz(new posix_time_zone("EST+5:00:00"));


local_date_time jpn_time(date(2012,Jan,3), hours(16), jst_tz,local_date_time::NOT_DATE_TIME_ON_ERROR);
local_date_time osaka_time = jpn_time.local_time_in(chi_tz);
std::cout<<"osaka_time: "<<osaka_time<<std::endl;
return 0;
}

最佳答案

首先让我们更改语法并将问题分开,因为我看到有 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 时间,然后您可以使用它来做任何您需要的事情。

最后但并非最不重要的 boost 。可以肯定的是,它是一个功能强大的库,但我认为此时您不需要为项目添加复杂性。如果您仍然想尝试一下或者您不在 POSIX 兼容系统上,您可以查看 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 中的示例

尤其是最后一个。因此,对于您的示例,它将是:

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% 正确,但您明白了。

例子:

#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;
}

关于c++ - 在 C++/boost 中将日期时间转换为不同的时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8916071/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com