我有一个日期时间值为2013-11-28T14:48:25.423-08:00
的XML文件。
我的服务器的时区是UTC +08:00 Irkutsk
。
问题是:
当我使用DataSet.ReadXML()
读取XML
并将其插入到MSSQL datatable
中时,值移动到我的timezone
,看起来像2013-11-29 06:48:25.423
。
但我需要timezone
不知道的值,它应该看起来像2013-11-28 14:48:25.423
。
有可能吗?
感谢
您的问题与SQL Server无关,而是与DataSet.ReadXML
在.NET中的行为有关。(我已将您的问题重新标记为)
你问的很多问题在很大程度上取决于你正在使用的确切代码,以及数据的外观。例如,考虑以下内容:
var ds = new DataSet("MyDataSet");
var dt = ds.Tables.Add("MyDataTable");
dt.Columns.Add("MyDateTime", typeof (DateTime));
var startingDateTime = DateTime.Now;
dt.Rows.Add(startingDateTime);
var sb = new StringBuilder();
using (var writer = new StringWriter(sb))
ds.WriteXml(writer, XmlWriteMode.WriteSchema);
Debug.WriteLine(sb.ToString());
var ds2 = new DataSet();
using (var reader = new StringReader(sb.ToString()))
ds2.ReadXml(reader, XmlReadMode.ReadSchema);
var resultingDateTime = (DateTime) ds2.Tables[0].Rows[0]["MyDateTime"];
Debug.WriteLine("");
Debug.WriteLine("Starting: {0} ({1})", startingDateTime, startingDateTime.Kind);
Debug.WriteLine("Ending: {0} ({1})", resultingDateTime, resultingDateTime.Kind);
调试输出:
<MyDataSet>
<xs:schema id="MyDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="MyDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="MyDataTable">
<xs:complexType>
<xs:sequence>
<xs:element name="MyDateTime" type="xs:dateTime" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
<MyDataTable>
<MyDateTime>2013-12-02T15:59:58.5209045-07:00</MyDateTime>
</MyDataTable>
</MyDataSet>
Starting: 12/02/2013 15:59:58 (Local)
Ending: 12/02/2013 15:59:58 (Unspecified)
因为我在XML中包含了模式(使用XmlWriteMode.WriteSchema
和XmlReadMode.ReadSchema
),所以数据被正确地反序列化为DateTime
。您将遇到的唯一问题是DateTimeKind
没有持久化。如果这是一个问题,那么考虑使用DateTimeOffset
类型而不是DateTime
。
若您想用您用来反序列化XML的特定代码以及与该代码一起工作的XML示例来更新您的问题,那么也许我可以提供一个更直接的答案。
如果可以的话,在写入数据时最容易解决这个问题。
问题是2013-11-28T14:48:25.423-08:00中有时区,因此在读取时,ReadXml方法中的反序列化会对其进行解释和更改。基本上,有了时区,它指的是一个特定的时间点,无论当地时区是什么,而没有时区,它则指的是时钟的特定时间。
如果使用DataSet.WriteXML()
,则可以将需要更改的日期时间列的DateTimeMode
属性设置为System.Data.DataSetDateTime.Unspecified
。在数据集加载数据之前,可能需要执行此操作。这将在编写XML时更改序列化。