TimeZoneInfo.ConvertTimeFromUtc вернул неверный DateTime

Хотя ссылка [Forms]! ... по умолчанию ссылается на форму, когда QueryDef запускается из графического интерфейса, на самом деле это просто еще один параметр в запросе в VBA. В результате вы не должны перекодировать ваш запрос / создать новый. Кроме того, как отметил @Brad, независимо от того, находится ли параметр в конечном запросе цепочки запросов или нет, вы можете ссылаться на параметр так, как если бы он был в коллекции окончательного запроса. В этом случае вы должны использовать код, подобный этому:

Sub GetQryAllocDebits(dteAllocStart As Date, dteAllocEnd as Date)

    Dim db As DAO.Database
    Dim qdf As DAO.QueryDef
    Dim rst As DAO.Recordset

    Set db = CurrentDb()
    Set qdf = db.QueryDefs("qryAlloc_Debit")

    If CurrentProject.AllForms("frmReportingMain").IsLoaded Then
        qdf.Parameters("[forms]![frmReportingMain]![txtAllocStart]") = [forms]![frmReportingMain]![txtAllocStart]
        qdf.Parameters("[forms]![frmReportingMain]![txtAllocEnd]") = [forms]![frmReportingMain]![txtAllocEnd]
    Else
        qdf.Parameters("[forms]![frmReportingMain]![txtAllocStart]") = CStr(dteAllocStart)
        qdf.Parameters("[forms]![frmReportingMain]![txtAllocEnd]") = CStr(dteAllocEnd)
    End If

    Set rst = qdf.OpenRecordset

    Do Until rst.EOF
        '...do stuff here.
    Loop

    Set rst = Nothing
    Set qdf = Nothing
    Set db = Nothing

End Function

Если ссылочная форма открыта, код достаточно умен, чтобы использовать ссылочные элементы управления в форме. Если нет, он будет использовать даты, предоставленные подпрограмме в качестве параметров. Здесь вы найдете, что параметры не понравились, когда я задал их как типы даты (# xx / xx / xx #), даже если поле было датами. Казалось, что это нормально работает, если я задаю параметры как строки. Это, казалось, не проблема, если вытащить значения прямо из элементов управления на формах.

1
задан ivanof81 13 July 2018 в 13:18
поделиться

2 ответа

UTC равно GMT. Но в настоящее время мы находимся в BST из-за лета, который является GMT + 1. GMT Standard Time автоматически настраивается для перехода на летнее время. Используйте Greenwich Standard Time, а не GMT Standard Time, если вы не хотите регулировать переход на летнее время.

EDIT: Все, что вам нужно сделать, это изменить GMT Standard Time на Greenwich Standard Time (см. Ниже)

TimeZoneInfo.ConvertTimeFromUtc(DateTime.Now.ToUniversalTime(), TimeZoneInfo.FindSystemTimeZoneById("Greenwich Standard Time"))
2
ответ дан Lucax 17 August 2018 в 12:45
поделиться

DateTime.Now.ToUniversalTime() уже перенастраивает UTC, вам не нужно снова преобразовывать этот в UTC.

Подсказка: используйте DateTime.UtcNow, если вам действительно нужен UTC, тогда вам вообще не нужно заботиться о часовых поясах и о том, каким может быть ваш местный часовой пояс.

Обновление: О, и «GMT стандартное время» не означает «среднее время по Гринвичу».

0
ответ дан PMF 17 August 2018 в 12:45
поделиться
  • 1
    Этот код запускается в метод. Часовой пояс является параметром метода. – ivanof81 13 July 2018 в 14:36
Другие вопросы по тегам:

Похожие вопросы: