如何通过时区更改日期时间值

时间:2013-11-30 08:26:45

标签: c# xml datetime timezone

我有一个日期时间值为2013-11-28T14:48:25.423-08:00的XML文件。

我服务器的时区是UTC +08:00 Irkutsk

问题是:

当我使用XML阅读DataSet.ReadXML()并将其插入MSSQL datatable时,该值会转移到我的timezone,看起来像2013-11-29 06:48:25.423

但我需要timezone不知道的值,它应该看起来像2013-11-28 14:48:25.423

有可能吗?

由于

2 个答案:

答案 0 :(得分:1)

您的问题与SQL Server没有任何关系,而是与.NET中DataSet.ReadXML的行为有关。我将假设C#作为答案。 (我已经重新标记了你的问题)

您要问的很多内容在很大程度上取决于您使用的确切代码以及数据的外观。例如,请考虑以下事项:

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示例,那么也许我可以提供更直接的答案。

答案 1 :(得分:0)

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

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

如果您使用的是DataSet.WriteXML(),则可以在数据集加载数据之前设置需要更改为DateTimeMode的日期时间列的System.Data.DataSetDateTime.Unspecified属性。这会在写入XML时更改序列化。