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# 代码可以从一个数据库中复制行并将它们插入到另一个数据库中。它使用 DataTable
和 SqlBulkCopy
.
执行此操作
当导入我的 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# 隐式处理从 DateTime
到 DbType.DateTimeOffset
的转换的需要,后者添加了不需要的偏移量。
编辑
阅读评论,@JohnSkeet 基本上推荐了这个,但我没有阅读每个人的评论。
我有一些 C# 代码可以从一个数据库中复制行并将它们插入到另一个数据库中。它使用 DataTable
和 SqlBulkCopy
.
当导入我的 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# 隐式处理从 DateTime
到 DbType.DateTimeOffset
的转换的需要,后者添加了不需要的偏移量。
编辑
阅读评论,@JohnSkeet 基本上推荐了这个,但我没有阅读每个人的评论。