C#:如何在插入到DateTimeOffset SQL Server列时停止将时区偏移量添加到System.DateTime
我有一些C#代码,它从一个数据库复制行并将它们插入另一个数据库。它使用C#:如何在插入到DateTimeOffset SQL Server列时停止将时区偏移量添加到System.DateTime,c#,sql-server,timezone-offset,datetimeoffset,C#,Sql Server,Timezone Offset,Datetimeoffset,我有一些C#代码,它从一个数据库复制行并将它们插入另一个数据库。它使用DataTable和SqlBulkCopy来实现这一点 当导入到我的C#应用程序中时,时间戳列在插入SQL Server的DataTable中具有数据类型System.DateTime。执行SqlBulkCopy.WriteToServer()后,目标表中的时间戳值的类型为datetimeoffset(6),并添加了时区偏移量(…+01:00) 我如何阻止这种情况发生?这并不总是发生,只是最近才开始发生 更新: 出于我的目的,
DataTable
和SqlBulkCopy
来实现这一点
当导入到我的C#应用程序中时,时间戳列在插入SQL Server的DataTable
中具有数据类型System.DateTime
。执行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
在本地时区(大部分时间都在本地时区)
提供了几个有关如何在两者之间转换的示例。请注意,
SpecifyKind
不需要有DateTimeOffset
类型。如果有DateTime
并尝试将其写入DateTimeOffset
C,则必须确定要使用的时区。有显式转换函数允许您指定,但如果您不指定,它将假定DateTime
在本地时区(大部分时间都在本地时区)
提供了几个有关如何在两者之间转换的示例。请注意,SpecifyKind
不需要有DateTimeOffset
类型。在将时间戳列插入Sql Server之前,在时间戳列上使用DateTime.SpecifyKind()对我不起作用
我通过将System.DateTime
列转换(强制转换)为DateTimeOffset
,显式偏移量为newtimespan(0,0,0)
,解决了这个问题。这消除了C#隐式处理从DateTime
到DbType.DateTimeOffset
的转换的需要,该转换添加了不需要的偏移量
编辑
在阅读评论时,@JohnSkeet基本上推荐了这一点,但我并没有阅读每个人的评论。在将时间戳列插入Sql Server之前,在时间戳列上使用DateTime.SpecifyKind()对我来说不起作用
我通过将System.DateTime
列转换(强制转换)为DateTimeOffset
,显式偏移量为newtimespan(0,0,0)
,解决了这个问题。这消除了C#隐式处理从DateTime
到DbType.DateTimeOffset
的转换的需要,该转换添加了不需要的偏移量
编辑
在阅读评论时,@JohnSkeet基本上推荐了这一点,但我没有阅读每个人的评论。那么你期望的时区是什么
datetimeoffset
总是有一个时区,所以如果你问如何删除它,答案就是你没有。如果您不想要时区,请不要使用datetimeoffset
@Larnu签出我对question@ScottHannen请参阅我的更新:)向我们展示您用于将数据插入SQL实例的代码。此文档可能会有所帮助。它处理SqlBulkCopy
如何转换DateTime
以及一些您可以更改的设置。那么您期望的时区是什么呢datetimeoffset
总是有一个时区,所以如果你问如何删除它,答案就是你没有。如果您不想要时区,请不要使用datetimeoffset
@Larnu签出我对question@ScottHannen请参阅我的更新:)向我们展示您用于将数据插入SQL实例的代码。此文档可能会有所帮助。它处理SqlBulkCopy
如何转换DateTime
以及您可以更改的一些设置。转换由SqlBulkCopy处理,因此我无法使用这些显式转换函数:/I将尝试更改数据表的定义方式以利用此功能(将其更改为使用datetimeoffset而不是DateTime)@TurgidWizard:我认为Kind是在DateTime
中指定的。您可以通过调用SpecifyKind
并将结果存储回DataTable
来覆盖每个DateTime
。这是一个很好的建议,但似乎不起作用:(我更改了填充DataTable的代码,以检查列是否为System.DateTime,如果为,则使用colArray[I]=DateTime.SpecifyKind(DataReader[I],DateTimeKind.Utc)填充值)…但是,在插入sql Server时仍会添加偏移量转换由SqlBulkCopy处理,因此我无法使用这些显式转换函数:/I将尝试更改数据表的定义方式以利用此功能(将其更改为使用datetimeoffset而不是datetime)@TurgidWizard:我认为Kind是在DateTime
中指定的。您可以通过调用SpecifyKind
并将结果存储回DataTable
来覆盖每个DateTime
。这是一个很好的建议,但似乎不起作用:(我更改了填充DataTable的代码,以检查列是否为System.DateTime,如果为,则使用colArray[I]=DateTime.SpecifyKind(DataReader[I],DateTimeKind.Utc)填充值)。但是,在插入sql server时仍会添加偏移量