C#: как остановить смещение часового пояса, добавляемое в System.DateTime при вставке в столбец DateTimeOffset SQL Server - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть некоторый код C#, который копирует строки из одной базы данных и вставляет их в другую. Это делается с использованием DataTable и SqlBulkCopy.

. При импорте в мое приложение C# столбцы меток времени имеют тип данных System.DateTime внутри DataTable, который вставляется в SQL Сервер. После выполнения SqlBulkCopy.WriteToServer() значения временных меток в таблицах назначения имеют тип datetimeoffset(6) и к ним добавляется смещение часового пояса (... +01: 00).

Как мне остановить это? Это не всегда происходило, только начало происходить недавно.

ОБНОВЛЕНИЕ:

Ожидаемый часовой пояс UT C, всегда, для моих целей. Однако я вынужден хранить это в столбце datetimeoffset по деловым причинам. Так что я ожидаю +00: 00

DataTable data = importer.GetDataTable();

using (SqlBulkCopy copy = new SqlBulkCopy(conn)){
   copy.WriteToServer(data);
}

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

Использование DateTime.SpecifyKind () для столбцов отметок времени перед вставкой их в Sql Сервер не работает для меня.

Я решил эту проблему путем преобразования (приведения) столбцов System.DateTime в DateTimeOffset с явным смещением new TimeSpan(0, 0, 0). Это избавило от необходимости C# неявно обрабатывать преобразование из DateTime в DbType.DateTimeOffset, которое добавляло нежелательное смещение.

EDIT

Читая комментарии, @JohnSkeet по существу рекомендовал это но я не читал все комментарии.

1 голос
/ 20 апреля 2020

Если у вас есть DateTime и вы пытаетесь записать его в DateTimeOffset C#, необходимо выяснить, какой часовой пояс использовать. Существуют явные функции преобразования, которые позволяют вам указывать, но если вы этого не сделаете, вы будете предполагать, что DateTime находится в местном часовом поясе (как и в большинстве случаев).

https://docs.microsoft.com/en-us/dotnet/standard/datetime/converting-between-datetime-and-offset предоставляет несколько примеров того, как конвертировать между ними. Обратите внимание, что SpecifyKind не требует наличия типа DateTimeOffset.

...