c# - 当时间具有时区信息时,将 XML 读入 Datatable 会给出不正确的 DateTime

标签 c# xml datetime timezone

所以我的客户运行一些代码,将他们的当前时间写入一个 xml 文件,然后我想将该文件读回数据表,但我得到的时间信息不正确。

例如,他们的当前时间是 09:31 他们的时区是 UTC+1:00

我的代码是:

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);
String xmlDT = String.Empty;

using (MemoryStream memoryStream = new MemoryStream())
{
    dt.WriteXml(memoryStream,XmlWriteMode.WriteSchema);
    xmlDT = Encoding.UTF8.GetString(memoryStream.ToArray());
}
string myFile = @"C:\Users\me\Documents\test1.txt"
XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlDT);
doc.Save(myFile);

myFile 现在包含:

<NewDataSet>
  <xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:MainDataTable="MyDataTable" 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>2015-02-12T09:31:37.4250365+01:00</MyDateTime>
  </MyDataTable>
</NewDataSet>

然后这个文件被发送到我在英国的服务器 (+00:00) 然后我使用以下命令读取文件:

DataTable datatable2 = new DataTable();
datatable2.ReadXml(myFile);

我的数据表现在包含 1 行,其日期时间为 08:30 但这是不正确的,我希望它存储客户时间。我如何通过更改我的客户端或服务器代码来执行此操作?

最佳答案

所以客户端你可以添加行:

dt.Columns[0].DateTimeMode = DataSetDateTime.Unspecified;

或作为更通用的方法:

public static void RemoveTimezoneForDataSet(DataSet ds)
{
    foreach (DataTable dt in ds.Tables)
    {
        foreach (DataColumn dc in dt.Columns)
        {

            if (dc.DataType == typeof(DateTime))
            {
                dc.DateTimeMode = DataSetDateTime.Unspecified;
            }
        }
    }
}

这会将 XML 保存为:

<NewDataSet>
  <xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:MainDataTable="MyDataTable" msdata:UseCurrentLocale="true">
      <xs:complexType>
        <xs:choice minOccurs="0" maxOccurs="unbounded">
          <xs:element name="MyDataTable">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="MyDateTime" msdata:DateTimeMode="Unspecified" type="xs:dateTime" minOccurs="0" />
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:choice>
      </xs:complexType>
    </xs:element>
  </xs:schema>
  <MyDataTable>
    <MyDateTime>2015-02-12T09:13:39.8180356</MyDateTime>
  </MyDataTable>
</NewDataSet>

所以时间在服务器上正确序列化

关于c# - 当时间具有时区信息时,将 XML 读入 Datatable 会给出不正确的 DateTime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28472824/

相关文章:

c# - GC.AddMemoryPressure() 不足以按时触发 Finalizer 队列执行

Python获取上月和上年

c# - 可为空的日期时间的 DateTime.Ticks

javascript - 在 Blogger XML 文件中使用 javascript 显示帖子的所有标签

c# - 在 .NET 中存储常量值的最佳方式

mysql - 获取具有当前日期时间的记录

c# - 如何在 C# 中创建横幅面板?

c# - VS Code 中的智能感知/代码完成对 XML 没有帮助

C# - ListBox/ListView 同时支持数据绑定(bind)和缩略图

android - 如何在 Android 中使 Canvas 透明?