您知道该检查是否存在API吗?
答案 0 :(得分:3)
GetTimeZoneInformation就是您所需要的。
您可以调用它并检查返回的值,以检测在调用时是否启用了夏令时。它还填充了一个结构,其中包含切换到夏令时和夏令时的规则。填充此结构并以UTC格式指定任何给定时间后,您可以相对轻松地计算该时间是否适用于夏令时或标准时间。
答案 1 :(得分:0)
一切顺利,但GetTimeZoneInformation和GetDynamicTimeZoneInformation仅返回当前时区设置。如果当前的TZ(即我的服务器所在的地方)不是我要检查的TZ怎么办?
假设我有一个服务器应用程序,可以预订结账簿。您可以说“我想立即查看”或“我将来需要在 datetime 查看”。结账时间在用户的当地时间输入,并在存储之前转换为UTC。当用户检索其结帐清单时,时间将转换回其本地以供显示。
假设服务器位于纽约,并按照2007年美国的标准DST规则运行。时区设置为美国东部,目前是7/27/2009 15:30,因此DST开启。
纽约的用户输入本地日期和时间。从ET转换为UTC - 不是问题。他们进入未来的日期 - 很好。我使用上面两个API调用中的一个并计算出来。
然而,悉尼的用户希望预订结账。她要求在12/13/2009 18:25结账,相对于她在悉尼的当地时区。我不能使用我当地的TZ信息 - 悉尼和纽约不遵循相同的DST规则。如何加载悉尼目前的TZ信息并查明是否有任意日期是否为DST?
答案 2 :(得分:0)
对于Win7和Server2008 / R2,MS-Windows上有一些较新(但仍然不完整)的方法。请参阅KB 2731771.另请参阅ICU和Boost :: locale。 Windows例程(GetTimeZoneInformationForYear)要求您已将UTC转换为将年份降至最低。幸运的是,我所知道的1月1日左右没有时区转移。您可以使用SystemTimeToTzSpecificLocalTime(Ex)将本地时间正确转换为与本地系统时区不同的时区。 如果没有这些方法,您需要扫描注册表以加载正确的时区信息和动态信息,然后调用SystemTimeToTzSpecificLocalTime。 小心使用_tzset和localtime之类的东西,因为有些系统(比如Windows)假设很多(大多数是不正确的)东西,比如使用美国DST规则,即使你的TZ设置是针对澳大利亚的。
您认为Windows和Linux都会采用一些非常标准的方式来执行UTCtoLocal(const char * tzName,time_t inTime,struct tm * outTime),同时考虑时区的所有动态/历史DST规则给出。 tzName应该能够采用适当的名称,如“Central Standard Time”或“America / Chicago”,具体取决于您运行的系统。我甚至愿意允许两个通话步骤 GetTimeZoneInformation(const char * tzName,TIME_ZONE_INFORMATION * outTZInfo) UTCtoLocal(const TIME_ZONE_INFORMATION * inTZInfo,time_t inTime,struct tm * outTime) 您知道操作系统在加载系统时区信息并且库执行本地/ UTC转换时已经这样做了。