如何通过时区更改datetime值



我有一个日期时间值为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.WriteSchemaXmlReadMode.ReadSchema),所以数据被正确地反序列化为DateTime。您将遇到的唯一问题是DateTimeKind没有持久化。如果这是一个问题,那么考虑使用DateTimeOffset类型而不是DateTime

若您想用您用来反序列化XML的特定代码以及与该代码一起工作的XML示例来更新您的问题,那么也许我可以提供一个更直接的答案。

如果可以的话,在写入数据时最容易解决这个问题。

问题是2013-11-28T14:48:25.423-08:00中有时区,因此在读取时,ReadXml方法中的反序列化会对其进行解释和更改。基本上,有了时区,它指的是一个特定的时间点,无论当地时区是什么,而没有时区,它则指的是时钟的特定时间。

如果使用DataSet.WriteXML(),则可以将需要更改的日期时间列的DateTimeMode属性设置为System.Data.DataSetDateTime.Unspecified。在数据集加载数据之前,可能需要执行此操作。这将在编写XML时更改序列化。

相关内容

  • 没有找到相关文章

最新更新