.NET DateTime.Now returns incorrect time when time zone is changed

前端 未结 4 1149
抹茶落季
抹茶落季 2020-11-29 02:39

This problem occurred during daylight saving time change. After the change occurred, we\'ve noticed that our server application started writing into the log incorrect time -

4条回答
  •  余生分开走
    2020-11-29 02:54

    In my project I needed to Reset a series of variables if the Time (or Timezone) was changed. So that I could get the fact this event occurred I ended up using a WindowsMessageFilter.

    I'm using .Net 2.0 so I couldn't use (or maybe i'm looking in the wrong places for) the ClearCachedData so I used this approach with the help of a little reflection.

        Private mTZChangeFilter As WindowsMessageFilter
    
    
        mTZChangeFilter = New WindowsMessageFilter()
        AddHandler mTZChangeFilter.TimeChanged, AddressOf onTimeChanged
    
        Application.RemoveMessageFilter(mTZChangeFilter)
    
    
    Public Class WindowsMessageFilter
        Implements IMessageFilter
    
         _
        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
    

提交回复
热议问题