将datetime从一个时区转换为另一个时区(本机C ++)

时间:2010-07-05 15:36:24

标签: c++ windows timezone

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

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

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

我可以要求我的客户以UTC或GTM发送每个日期时间,但这并不能解决我的问题,因为我仍然需要将其转换为'实例'的时区,该实例可以是任何时区。世界。

我似乎也没有找到执行此操作的Windows功能。我找到的是一个托管的.Net类来执行此操作,但我希望我的应用程序严格不受管理。

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

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

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

所有这些DST转换信息都可以在Windows注册表中的某处获得。问题是:我可以使用哪种Windows功能来利用这些信息。

1 个答案:

答案 0 :(得分:2)

我不知道如何通过API提取有关其他TimeZones的信息:我已经看到它通过查询注册表完成(我们在基于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