Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Delphi检测夏令时内或夏令时外的转换_Delphi_Timezone_Detect_Dst - Fatal编程技术网

使用Delphi检测夏令时内或夏令时外的转换

使用Delphi检测夏令时内或夏令时外的转换,delphi,timezone,detect,dst,Delphi,Timezone,Detect,Dst,我需要在电脑进入或退出夏令时时触发一个事件。我可以使用GetTimezoneInformation监视当前状态,并在等待更改时每秒检查一次,但我只是认为可能有一种更简单的方法,不需要连续检查。根据这一点 windows不会在夏令时事件中发送WM_时间更改。解决方法(我没有使用任何一种,所以我不确定它是否有效): 每隔几秒钟左右检查一次当地时间(恶心) 将计算更改为基于GMT 看电视 HKLM\System\CurrentControlSet\Control\TimeZoneInformatio

我需要在电脑进入或退出夏令时时触发一个事件。我可以使用GetTimezoneInformation监视当前状态,并在等待更改时每秒检查一次,但我只是认为可能有一种更简单的方法,不需要连续检查。

根据这一点 windows不会在夏令时事件中发送WM_时间更改。解决方法(我没有使用任何一种,所以我不确定它是否有效):

  • 每隔几秒钟左右检查一次当地时间(恶心)
  • 将计算更改为基于GMT
  • 看电视 HKLM\System\CurrentControlSet\Control\TimeZoneInformation\ActiveTimeBias 使用RegNotifyChangeKeyValue()获取的值(当存在 DST转换以及时区变化时)
致以最诚挚的问候,
Radu

至少对英国(其他国家不确定)来说,这种转换只发生在周日上午,这样有助于将您的支票频率减少到每周只有几个小时。此外(同样适用于英国),这通常发生在3月和10月的最后一个周末,因此您可以进一步缩短执行检查的时间

如果您可以收集您感兴趣的每个国家的规则,并对其逻辑进行编码,那么这显然比持续检查更有效,但当然,您需要对正确性负责,而不是依赖操作系统。

帮助您跟踪应在何时发生转换的算法


--jeroen

正如一些帖子所说,缺少的WM_时间更改似乎仅限于Win2K系统。这里有人用Windows XP成功地测试了它:应用程序是WinXP/Win7,所以我将对WM_TIMECHANGE事件进行编码,看看它是否在W7上工作。DST规则可能会频繁更改,所以我不会手动维护它们。有趣的阅读:。引用:“[…]有关夏令时的法律一直在变化。”-1这是一个糟糕的建议。你需要依靠系统来为你做到这一点。@David,我觉得这有点苛刻-当然,“周末只检查”优化对欧洲、美国和加拿大的DST都是正确的(包括规则改变时,例如几年前美国移动了一周)。同样,2am规则可以可靠地用于这些区域。每秒24x7轮询一次效率低下,这是不必要的。我还在第2段中提出了一个警告,这样就不会像我给出了愚蠢的建议,建议你可以做得比操作系统供应商更好。谢谢你的评论。我已经讨论过检测我们是否在DST中的问题。客户端希望在发生转换时记录一个事件。由于规则发生了变化,我将从Jeroen的建议开始,但将这些值输入到您的算法中,因此它是可配置的。