c++ - 将日期时间从一个时区转换为另一个时区( native C++)

标签 c++ windows timezone

来自世界各地的客户可以向我的服务器应用程序发送某些“请求”。所有这些客户都位于许多不同的时区。

对于每个请求,我都需要将请求映射到一个内部 C++ 类实例。每个类实例都有一些关于其“位置”的信息,这些信息也由时区指示。

每个客户都可以发送与属于不同时区的实例相关的请求。为了防止我的客户将所有内容自己转换为“目标”实例的时区,我必须自己将所有内容从一个时区转换为另一个时区。但是,我只在 C++(非托管、 native )函数中找到在本地时间和 GTM 之间转换时间的函数,而不是从/到不是您当前时区的时区。

我可以要求我的客户以 UTC 或 GTM 格式发送每个日期时间,但这并不能解决我的问题,因为我仍然必须将其转换为“实例”的时区,它可以是世界。

我似乎也没有找到执行此操作的 Windows 函数。我确实找到了一个执行此操作的托管 .Net 类,但我想让我的应用程序严格不受管理。

是否有任何我可以使用的 Windows(XP、Vista、7、2003、2008)功能(以及我在文档中忽略的功能),或者是否有任何其他免费算法可以在一个时区和另一个时区之间转换?

请注意,造成问题的不是 GMT 差异,而是似乎取决于时区的实际 DST 转换时刻。例如:

  • 西欧在 4 月 1 日之前的最后一个星期日从非夏令时改为夏令时。
  • 美国在 3 月 1 日之后的第二个星期日从非夏令时改为夏令时。
  • 中国没有夏令时。
  • 澳大利亚在 10 月 1 日之后的第一个星期日从非夏令时改为夏令时。

所有这些 DST 转换信息都可以在 Windows 注册表中的某个位置找到。问题是:我可以使用哪个 Windows 函数来利用此信息。

最佳答案

我不知道有什么方法可以通过 API 提取有关其他时区的信息:不过我已经看到它是通过查询注册表来完成的(我们在基于 WindowsCE 的产品中这样做)。

TimeZones 被定义为

下的注册表项
HKLM\Software\Microsoft\Windows NT\Current Version\Time Zones

每个键包含多个值,告诉您偏移量和夏令时的是 TZI 键。这是一个二进制 blob,它代表了这个结构:

typedef struct
{
    LONG m_nBias;
    LONG m_nStandardBias;
    LONG m_nDaylightBias;
    SYSTEMTIME m_stcStandardDate;
    SYSTEMTIME m_stcDaylightDate;
} TZI;

查看 MSDN 的 TIME_ZONE_INFORMATION 页面 (http://msdn.microsoft.com/en-us/library/ms725481(v=VS.85).aspx),了解如何解释 Bias 字段,尤其是 StandardDate 和 DaylightDate 字段——它们被温和地滥用以支持诸如“四月的最后一个星期六”的结构。

HTH

关于c++ - 将日期时间从一个时区转换为另一个时区( native C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3180702/

相关文章:

c++ - 对象上的范围解析运算符

c++ - 关于如何使用简单的 C++ 库(不使用 .net)和使用该库的 C++ 项目创建 .sln 的基本说明?

linux - 如何从批处理文件在putty上执行命令?

c# - RDP 上不同语言的 TimeZoneInfo

Java - SQL时间戳的时区转换问题

c++ - 如何在 iPhone 项目中使用 Boost uBLAS C++ 库?

windows - -webkit-backface-visibility 在 Windows 上的 node-webkit 中不起作用

c# - Windows 2000 SP4 上的单声道

r - 使用 format.Posix* 在 R 中使用时区格式化 Sys.time() 的输出

c++ - 在 Windows 10 x64 上使用 Ninja 作为 MSYS2 + MinGW 的生成器