“根据夏令时变化调整时钟”选项如何影响 Delphi NOW 函数的结果?
我意识到这个问题可以通过编写一些测试代码来回答。我并不懒惰,我只是认为答案可能普遍有用。
我有一个应用程序生成了大量数据,其中的记录带有当地时间(由 NOW 例程返回)。我们在夏令时的进出转换方面遇到了障碍 - 即,当我们更改为夏令时时,会缺少一个小时,而当我们退出夏令时时,会重复一个小时。这会导致假设日期排序记录的操作出现问题。
因此,该应用程序已更改为可以使用 UTC 中的所有日期时间,但我将能够显示 UTC 或本地时间中的日期时间。我还必须处理以本地时间存储的日期时间,并确保它们正确地转换为 UTC。这很棘手,因为日期时间可能是在 DST 生效时存储的,因此在一般情况下,我需要能够确定任何随机日期是否在 DST 期间内或之外。当然,有一小时的日期时间是不明确的,可能是夏令时结束前的最后一小时,也可能是夏令时结束后的第一个小时。没有办法解决这个问题。
在对更改进行编码时,我想知道 NOW 调用的结果。它在内部调用 GetLocalTime。当您处于 DST 期间,但“根据夏令时变化调整时钟”选项已关闭时,GetLocalTime(和 NOW)会返回什么?
如何编写一个例程,无论“调整夏令时变化的时钟”是关闭还是打开,都返回 DST 周期内的当前日期时间(应用了 DST 偏差)?
I realise this question could have been answered by writing some test code. I'm not lazy, I just thought that the answer might be generally useful.
I have an app that has generated a large amount of data with records that were stamped with the local time (as returned by the NOW routine). We have run into a snag with transitions in and out of daylight savings time - namely that there is an hour missing when we change to DST, and an hour repeated when we exit from DST. This causes problems with manipulations that assume date ordered records.
The app has been altered therefore to work with all datetimes in UTC, but I will have the ability to display datetimes in UTC or in local time. I also have to deal with datetimes that were stored in local time, and make sure they are correctly shifted to UTC. This is tricky, as the datetime might have been stored while DST was in effect, so in the general case I need to be able to determine if any random date is within or outside a DST period. There is of course a period of one hour where a datetime is ambiguous and could be in the last hour before daylight savings ended, or in the first hour after it ended. There is no way of resolving this.
In coding the changes, I wondered about the result of NOW calls. Internally it calls GetLocalTime. What does GetLocalTime (and NOW) return when you are inside a DST period, but the option to "Adjust clock for daylight saving changes" is turned off?
How do I write a routine that returns the current datetime inside a DST period (with the DST bias applied) regardless of whether "Adjust clock for daylight saving changes" is off or on?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我不认为你能轻易解决你的问题。
有太多变量:
准确可以帮助您处理时区规则的 Delphi TZDB 项目。
我认为不依赖上述所有变量,而是存储三个字段更实用:
您对第三个字段和前两个字段执行排序显示。
——杰罗恩
I don't think you can solve your problem easily.
There are too many variables:
There is a Delphi TZDB project that can help you with the time zone rules.
I think it is much more practical to not rely on all the above variables, but store three fields:
You perform the sorting on the third field, and the first two fields for displaying.
--jeroen
使用 TzSpecificLocalTimeToSystemTime (及其明显的逆)。这些允许您根据本地日期/时间有效的夏令时设置在 UTC 和本地日期/时间之间进行转换。如果您希望您的应用程序在 XP 之前的任何操作系统上运行,请使用“延迟”函数属性加载此应用程序(从 kernel32):
Use TzSpecificLocalTimeToSystemTime (and its obvious inverse). These allow you to convert between UTC and local date/time based on the daylight savings settings in effect at the local date/time. If you want your app to run on anything earlier than XP, load this (from kernel32) with the 'delayed' function attribute: