.NET DateTime. Теперь возвращает неправильное время, когда часовой пояс изменяется

Благодаря @cwhisperer. У меня была такая же проблема с Doctrine в приложении Symfony. Я просто добавил параметр в свой config.yml:

doctrine:
    dbal:
        driver:   pdo_mysql
        options:
            # PDO::MYSQL_ATTR_INIT_COMMAND
            1002: "SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''))"

Это сработало для меня.

38
задан Lance Roberts 25 June 2009 в 23:20
поделиться

3 ответа

Да, зона текущего времени кэшируется. На серьезном основании это избегает проблемы с поврежденным кодом, который использует DateTime. Теперь реализовать измерение прошедшего времени. Такой код имеет тенденцию переносить сердечный приступ, когда время внезапно изменяется на час или больше.

необходимо будет назвать Систему. Глобализация. CultureInfo. ClearCachedData () для сброса кэшируемого значения. Следующий вызов к DateTime. Теперь теперь даст новое местное время. При использовании.NET 3.5 класса TimeZoneInfo вообще тогда, необходимо будет также назвать его ClearCachedData () методом. Можно использовать SystemEvents. Событие TimeChanged как триггер.

48
ответ дан Daniel A.A. Pelsmaeker 27 November 2019 в 03:48
поделиться

Наиболее распространенная рекомендация состоит в том, чтобы сохранить DateTime. UtcNow и, когда Вы хотите показать локализованное время пользователю, преобразовывают в местное время, составляя переход на летнее время.

.NET обеспечивает для вычислений, связавших летнее время с DaylightTime и классы TimeZone , и , метод ToLocalTime , предположительно, может преобразовать UTC в локальный учет в течение летнего времени.

3
ответ дан 27 November 2019 в 03:48
поделиться

В моем проекте мне нужно было сбросить ряд переменных, если время (или часовой пояс) было изменено. Чтобы я мог понять, что это событие произошло, я в конечном итоге использовал WindowsMessageFilter.

Я использую .Net 2.0, поэтому я не мог использовать (или, может быть, ищу в неправильных местах) ClearCachedData, поэтому я использовал этот подход с помощью небольшого размышления.

    Private mTZChangeFilter As WindowsMessageFilter


    mTZChangeFilter = New WindowsMessageFilter()
    AddHandler mTZChangeFilter.TimeChanged, AddressOf onTimeChanged

    Application.RemoveMessageFilter(mTZChangeFilter)


Public Class WindowsMessageFilter
    Implements IMessageFilter

    <System.Diagnostics.DebuggerStepThrough()> _
    Public Function PreFilterMessage(ByRef m As System.Windows.Forms.Message) As Boolean Implements System.Windows.Forms.IMessageFilter.PreFilterMessage
        ' Debug.Print(m.Msg.ToString)
        If m.Msg = 30 Then
            ResetTimeZone()
            RaiseEvent TimeChanged(Me)
        End If
    End Function

    Private Sub ResetTimeZone()
        Dim tz As Type = GetType(System.TimeZone)
        Dim mth As System.Reflection.MethodInfo

        Try
            mth = tz.GetMethod("ResetTimeZone", BindingFlags.NonPublic Or BindingFlags.Static)
            mth.Invoke(mth, Nothing)
        Catch ex As Exception
            Debug.Print(ex.ToString)
        End Try
    End Sub 

end class
0
ответ дан 27 November 2019 в 03:48
поделиться