C#:如何在插入 DateTimeOffset SQL 服务器列时停止将时区偏移量添加到 System.DateTime

C# : how to stop timezone offset being added to System.DateTime when inserted into a DateTimeOffset SQL Server column

我有一些 C# 代码可以从一个数据库中复制行并将它们插入到另一个数据库中。它使用 DataTableSqlBulkCopy.

执行此操作

当导入我的 C# 应用程序时,时间戳列在 DataTable 中的数据类型为 System.DateTime,并插入到 SQL 服务器中。 SqlBulkCopy.WriteToServer() 执行后,目标表中的时间戳值具有类型 datetimeoffset(6) 并添加了时区偏移量 (... +01:00).

如何阻止这种情况发生?它并不总是发生,最近才开始发生。

更新:

出于我的目的,预期的时区始终是 UTC。但是,出于业务原因,我不得不将其存储在 datetimeoffset 列中。所以我期待 +00:00

DataTable data = importer.GetDataTable();

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

如果您有 DateTime 并尝试将其写入 DateTimeOffset,C# 必须确定要使用的时区。有明确的转换函数允许您指定,但如果您不指定,它将假定 DateTime 在当地时区(大部分时间都是)。

https://docs.microsoft.com/en-us/dotnet/standard/datetime/converting-between-datetime-and-offset 提供了几个关于如何在两者之间进行转换的示例。请注意 SpecifyKind 不需要 DateTimeOffset 类型。

在将时间戳列插入 Sql 服务器之前,在时间戳列上使用 DateTime.SpecifyKind() 对我不起作用。

我通过将 System.DateTime 列转换(转换)为 DateTimeOffset 并显式偏移 new TimeSpan(0, 0, 0) 来解决此问题。这消除了 C# 隐式处理从 DateTimeDbType.DateTimeOffset 的转换的需要,后者添加了不需要的偏移量。

编辑

阅读评论,@JohnSkeet 基本上推荐了这个,但我没有阅读每个人的评论。