Благодаря @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',''))"
Это сработало для меня.
Да, зона текущего времени кэшируется. На серьезном основании это избегает проблемы с поврежденным кодом, который использует DateTime. Теперь реализовать измерение прошедшего времени. Такой код имеет тенденцию переносить сердечный приступ, когда время внезапно изменяется на час или больше.
необходимо будет назвать Систему. Глобализация. CultureInfo. ClearCachedData () для сброса кэшируемого значения. Следующий вызов к DateTime. Теперь теперь даст новое местное время. При использовании.NET 3.5 класса TimeZoneInfo вообще тогда, необходимо будет также назвать его ClearCachedData () методом. Можно использовать SystemEvents. Событие TimeChanged как триггер.
Наиболее распространенная рекомендация состоит в том, чтобы сохранить DateTime. UtcNow и, когда Вы хотите показать локализованное время пользователю, преобразовывают в местное время, составляя переход на летнее время.
.NET обеспечивает для вычислений, связавших летнее время с DaylightTime и классы TimeZone , и , метод ToLocalTime , предположительно, может преобразовать UTC в локальный учет в течение летнего времени.
В моем проекте мне нужно было сбросить ряд переменных, если время (или часовой пояс) было изменено. Чтобы я мог понять, что это событие произошло, я в конечном итоге использовал 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