Я полностью осознаю неспособность DateDiff () справляться с проблемами перехода на летнее время. Поскольку я часто использую его для сравнения количества часов или дней между двумя датами с интервалом в несколько месяцев, мне нужно написать решение для обработки DST. Это то, что я придумал, функция, которая сначала вычитает 60 минут из значения даты и времени, если оно попадает в диапазоны дат, указанные в локальной таблице (LU_DST). Таким образом, использование будет:
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
Примечания
- Я посетил и импортировал файл BAS http://www.cpearson.com/excel/TimeZoneAndDaylightTime.aspx. Я потратил на его чтение не менее часа, и, хотя он может хорошо выполнять свою работу, я не могу понять, как его изменить мои потребности. Но если у вас есть ответ с использованием его структур данных, я посмотрю.
- Часовые пояса не являются проблемой, поскольку это все местное время.
Редактировать
Спасибо за решения, HansUp и Fenton, но, возможно, я вижу ошибку в WbemScripting:
Debug.Print Conv_date_to_Utc(#11/07/2009 02:15 PM#)
возвращается 7.11.2009 6:15:00
Debug.Print Conv_date_to_Utc(#11/08/2009 02:15 PM#)
возвращается 8.11.2009 19:15:00
(Я живу в GMT-05: 00). Каждый веб-сайт, который я могу найти, говорит, что DST-переключатель в ноябре 2009 года был 1-го, а не 7-го. Почему это говорит иначе?