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

2023-12-25

我有印度股票市场的价格数据,但其时间和日期戳是 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 date 来处理这个问题。

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

如果有一个特定的链接,或者更好的是,有人可以分享示例增强代码,这对于像我这样的 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 时间,然后您可以使用它来执行您需要的任何操作。

最后但并非最不重要的一点是提升。可以肯定的是,它是一个功能强大的库,但我认为对于该项目,您此时不需要增加它的复杂性。如果您仍然想尝试一下或者您没有使用 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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C++/boost 中将日期时间转换为不同时区 的相关文章

随机推荐

  • 网站图标必须为 32×32 或 16×16 吗?

    我想使用单个图像作为常规图标和 iPhone iPad 友好图标 这可能吗 如果作为常规浏览器图标链接 iPad 友好的 72 72 PNG 会缩放吗 或者我是否必须使用单独的 16 16 或 32 32 图像 2020 年更新 坚持 16
  • 检测倾斜字体中单词之间的空格(条)

    我编写了一个 python 脚本来检测图像中编码的字母 该脚本正在使用openCV模板匹配匹配图像中嵌入的字符 字母 除空格 空格键 字符外 检测工作正常 Here is a sample image 在 python 中是否有一些 简单
  • Pandas DataFrame 访问器类型提示

    Pandas 允许您使用以下方法扩展其 DataFrame 类pd api extensions register dataframe accessor 装饰师 虽然这是功能性的 但它不提供任何额外的类型提示功能 例如 我希望以下内容能够键
  • 视角约束有什么意义?

    在哪视图约束 http download oracle com docs cd B14117 01 server 101 b10759 clauses002 htm i1002565有用 我的意思是 Oracle 允许在视图上创建约束 它们
  • 用 AppCompat 替换 ActionBarSherlock

    我目前正在开发一个简单的导航抽屉 滑动选项卡 然而 我希望在我自己的应用程序上进行材料设计 所以 除了摆脱 我别无选择ActionBarSherlock 在这些尝试中 我发现有两种类型的导入 如下所示 import com actionba
  • 由属性公开的私有变量[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我搜索了一些文档 并尝试了 Xcode 和 AppCode 但我仍然对一些事情不确定 那么有人可以澄清我吗 如果我有名为 foo 的属性 是否应
  • Visual Studio 构建步骤和 MSBuild 构建步骤之间的差异

    我正在创建一些构建定义 我发现 Visual Studio 构建步骤和 MSBuild 构建步骤之间的唯一区别是 VS 构建步骤将 Visual Studio 版本添加到构建中 有人可以解释更多差异吗 正如丹尼尔提到的 它们几乎是一样的 主
  • 如何使用 Obj-C 轻松保存窗口大小和位置状态?

    使用 Obj C 记住应用程序加载之间的 Windows 位置的最佳方法是什么 我正在使用 Interface Builder 作为界面 是否可以通过绑定来做到这一点 推荐的方法是什么 谢谢 在 Interface Builder 的属性下
  • Nivoslider 更新或重启甚至销毁

    我在加载动态内容时尝试更新 nivoslider 时遇到一些问题 我需要做的是当我通过加载新内容时更新滑块AJAX call 所以基本上我有一个 div 从函数中获取新数据AJAX调用并在加载后我需要滑块重新初始化 我现在做的是这样的 if
  • Python 中的简单素数生成器

    有人可以告诉我这段代码做错了什么吗 无论如何 它只是打印 计数 我只想要一个非常简单的素数生成器 没什么花哨的 import math def main count 3 one 1 while one 1 for x in range 2
  • 反转带有重音字符的字符串?

    所以我看到了乔恩的双向飞碟video http vimeo com 7403673并且有一个代码示例 应该是有问题 逆转后 但我想它在 net2上失败了 恕我直言 无论如何它确实对我有用并且我确实看到了correct反转的字符串 char
  • 如何防止移动设备上弹出键盘?

    http api jqueryui com spinner http api jqueryui com spinner 我正在尝试在我的网站中使用上面的 jQuery spinner 它的演示位于 API 底部 它在计算机上确实有效 但在移
  • java.lang.reflect.Array 的 getter 和 setter 方法的目的是什么?

    Java类java lang reflect Array http docs oracle com javase 8 docs api java lang reflect Array html提供了一组用于动态创建数组的工具 然而除此之外
  • ChartJS - 绘制带有按月标签、按日数据的图表

    我想画一个折线图Chartjs http www chartjs org 按天显示数据 但按月标记 如果标签按天显示 则有很多点 所以 我想按月而不是按天显示标签 例如 有人可以教我怎么做吗 谢谢 只需将 xAxes gt time 属性配
  • Java 中考虑增补字符的字符串的总字符数(不是代码单元)

    考虑到字符串可能具有需要 2 个代码单元进行编码的增补字符 如何获取字符串的总字符数 Example String strTest a Supplementary character System out println strTest l
  • 有关禁用或隐藏菜单项的规则[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 您是否曾经遇到过这样的情况 您确实非常想使用某个菜单功能 但又无法使其被禁用或更糟的是全部消失 有一个论点是始终保持菜单启用状态 然后向用户显示
  • 我们可以在 C 中的 printf 中仅使用一个变量来表示多种格式描述符吗

    是否可以编写像我在下面编写的代码一样的代码 printf n c c n c only one variable for all printf c c c n only one variable for all 我必须在每种情况下打印不同的
  • Excel ExcelDNA C# / 尝试复制 Bloomberg BDH() 行为(在 Web 请求后写入数组)

    我想复制 Bloomberg BDH 的行为 BDH 发出 Web 请求并写入数组 但不返回数组样式 在此 Web 请求期间 该函数返回 N A Requesting 当 Web 请求完成时 BDH 函数将数组结果写入工作表中 例如 在Ex
  • 如何在 Apple Silicon (M1) 上运行 CocoaPods

    我有一个想要在 iOS 上运行的 Flutter 项目 它在我的基于 Intel 的 Mac 上运行正常 但在我的新的基于 Apple Silicon 的 M1 Mac 上无法安装 Pod LoadError dlsym 0x7f89260
  • 在 C++/boost 中将日期时间转换为不同时区

    我有印度股票市场的价格数据 但其时间和日期戳是 GMT 因此我可以使用代表正确日期和时间的数据 我需要将数据库中某些记录的日期和时间从 GMT 我当前的时区 转换为 IST mysql gt desc price hist Field Ty