【发布时间】:2017-03-17 00:18:20
【问题描述】:
我完全意识到 DateDiff() 无法处理夏令时问题。由于我经常使用它来比较相隔几个月的 2 个日期时间之间的小时数或天数,因此我需要编写一个解决方案来处理 DST。这就是我想出的,如果日期时间值落在本地表 (LU_DST) 中指定的日期范围内,则该函数首先从日期时间值中减去 60 分钟。因此,用法是:
datediff("n",Conv_DST_to_Local([date1]),Conv_DST_to_Local([date2]))
我的问题是:有没有更好的方法来处理这个问题?我会做出一个疯狂的猜测,我不是第一个提出这个问题的人。这似乎是应该添加到核心参考库之一的东西。有没有办法让我访问我的系统时钟来询问 DST 是否在某个日期和时间生效?
Function Conv_DST_to_Local(X As Date) As Date
Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("LU_DST")
Conv_DST_to_Local = X
While rst.EOF = False
If X > rst.Fields(0) And X < rst.Fields(1) Then Conv_DST_to_Local = DateAdd("n", -60, X)
rst.MoveNext
Wend
End Function
注意事项
- 我访问并导入了http://www.cpearson.com/excel/TimeZoneAndDaylightTime.aspx的BAS文件。我现在至少花了一个小时阅读它,虽然它可能做得很好,但我不知道如何根据我的需要对其进行修改。但是,如果您使用他的数据结构有答案,我会看看。
- 时区不是问题,因为这都是当地时间。
编辑
感谢 HansUp 和 Fenton 的解决方案,但我可能在 WbemScripting 中看到了一个错误:
Debug.Print Conv_date_to_Utc(#11/07/2009 02:15 PM#)
返回 2009 年 11 月 7 日下午 6:15:00
Debug.Print Conv_date_to_Utc(#11/08/2009 02:15 PM#)
返回 2009 年 11 月 8 日晚上 7:15:00
(我住在 GMT-05:00)。我能找到的每个网站都说 2009 年 11 月的夏令时转换是在 1 日,而不是 7 日。为什么会这样说?
【问题讨论】:
-
还要考虑日期/时间都在 DST 事件两侧的情况。也就是同年的一月和十二月。或者相隔两年的一月和十二月。
-
好主意,但我的解决方案和 HansUp 的解决方案都绕过了这个问题,分别处理 2 个日期时间,根据需要从两者中减去额外的小时,或从两者中减去一个小时,或两者都不减去。
-
WbemScripting 似乎也认为 DST 于 2009 年 3 月 15 日开始,而不是 3 月 8 日。很抱歉,它不可靠。
-
MS Access 并不适合专业开发人员。抱歉.. 它没有这个功能,SQL Server 2012 刚刚有了很多新的时区功能!