我完全知道DateDiff()无法处理夏时制问题。由于我经常使用它来比较两个月之间的两个日期时间之间的小时数或天数,因此我需要编写一个解决DST的解决方案。这就是我想出的一个函数,如果它属于本地表(LU_DST)中指定的日期范围,则该函数首先从datetime值中减去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月的DST切换是1号,而不是7号。为什么这样说呢?
最佳答案
警告:对于美国2009年的夏令时转换,以下方法无法返回正确的结果。
在将日期/时间值提供给DateDiff()之前考虑将其转换为UTC
Public Function VT_DATE_to_UTC(ByVal pDate As Date) As Date
Dim odateTime As Object
Set odateTime = CreateObject("WbemScripting.SWbemDateTime")
odateTime.SetVarDate pDate, True
VT_DATE_to_UTC = odateTime.GetVarDate(False)
Set odateTime = Nothing
End Function
立即窗口中的示例:
? DateDiff("n", #2010/03/14 01:00#, #2010/03/14 03:00#)
120
? DateDiff("n", VT_DATE_to_UTC(#2010/03/14 01:00#), _
VT_DATE_to_UTC(#2010/03/14 03:00#))
60
关于ms-access - MS Access中DateDiff()中的夏令时处理?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2517567/