我意识到可以通过编写一些测试代码来回答这个问题。我并不懒惰,我只是认为答案通常很有用。
我有一个应用程序,它生成了大量数据,其中包含用本地时间标记的记录(由NOW例程返回)。我们遇到了夏令时转换的障碍 - 即当我们改为DST时会丢失一个小时,而当我们退出DST时会重复一个小时。这会导致假定日期排序记录的操作出现问题。
因此,应用程序已被更改为与UTC中的所有日期时间一起使用,但我将能够以UTC或当地时间显示日期时间。我还必须处理以本地时间存储的日期时间,并确保它们正确地转换为UTC。这很棘手,因为在DST生效时可能已经存储了日期时间,所以在一般情况下我需要能够确定任何随机日期是否在DST期间之内或之外。当然有一个小时的时间段,其中日期时间是模糊的,可能是在夏令时结束之前的最后一小时,或者在结束之后的第一个小时。没有办法解决这个问题。
在对更改进行编码时,我想知道NOW调用的结果。在内部,它调用GetLocalTime。当您在DST期间内时,GetLocalTime(和NOW)会返回什么,但是“为夏令时更改调整时钟”选项是否已关闭?
如何编写一个在DST期间内返回当前日期时间的例程(应用了DST偏差),无论“夏令时调整时钟是否已更改”是否已关闭或打开?
答案 0 :(得分:4)
我认为你不能轻易解决问题 变量太多了:
有一个Delphi TZDB project可以帮助您制定时区规则。
我认为不依赖所有上述变量更实际,但存储三个字段:
您在第三个字段和前两个字段上执行排序。
- 的Jeroen
答案 1 :(得分:2)
使用TzSpecificLocalTimeToSystemTime(及其显而易见的反面)。这些允许您根据当地日期/时间生效的夏令时设置在UTC和本地日期/时间之间进行转换。如果您希望您的应用程序在早于XP的任何内容上运行,请使用'delayed'函数属性加载(来自kernel32):
function TzSpecificLocalTimeToSystemTime(lpTimeZoneInformation: PTimeZoneInformation;
var lpLocalTime, lpUniversalTime: TSystemTime): BOOL; stdcall;
function TzSpecificLocalTimeToSystemTime; external kernel32 name 'TzSpecificLocalTimeToSystemTime' delayed;