在.NET中使用DataSet.WriteXml时自定义DateTime格式

Mik*_*all 7 c# xml serialization dataset

我有一个问题,我正在写一个DataSet到XML有一个DateTime类型的列,我想控制输出格式.

DataSet data = LoadDataSet();
data.Tables[0].Rows[0]["MyDate"] = DateTime.Now;
data.WriteXml(myFile);
Run Code Online (Sandbox Code Playgroud)

默认情况下,XML中DateTime的格式如下所示:

2011-08-02T17:39:00-07:00
Run Code Online (Sandbox Code Playgroud)

我想使用自定义日期格式,或者至少删除时区信息.

有没有办法控制我的数据集XML中的DateTime列的格式?

我的直觉说没有,因为我假设这样做是为了促进跨时区的数据转换,但我注意到我可以成功读取DataSet XML,即使DateTime列标签省略了时区数据,所以我希望我能做点什么类似于写入XML时.

Moe*_*sko 11

如果您只能将时区信息删除,这种解决方法可能适用.DataSet中DateTime列的DateTimeMode属性的默认值为UnspecifiedLocal.您可以将DateTimeMode显式设置为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;
                }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

用法示例:

    DataSet ds = new DataSet();
    DataTable dt = new DataTable("t1");
    dt.Columns.Add("ID", typeof(int));
    dt.Columns.Add("DT", typeof(DateTime));
    dt.Rows.Add(new object[] { 1, new DateTime(2009, 1, 1) });
    dt.Rows.Add(new object[] { 2, new DateTime(2010, 12, 23) });

    ds.Tables.Add(dt);

    ds.WriteXml("c:\\Standard.xml");

    RemoveTimezoneForDataSet(ds);

    ds.WriteXml("c:\\WithoutTimezone.xml");
Run Code Online (Sandbox Code Playgroud)

输出:

Standard.xml:

<?xml version="1.0" standalone="yes"?>
<NewDataSet>
  <t1>
    <ID>1</ID>
    <DT>2009-01-01T00:00:00+11:00</DT>
  </t1>
  <t1>
    <ID>2</ID>
    <DT>2010-12-23T00:00:00+11:00</DT>
  </t1>
</NewDataSet>
Run Code Online (Sandbox Code Playgroud)

WithoutTimezone.xml:

<?xml version="1.0" standalone="yes"?>
<NewDataSet>
  <t1>
    <ID>1</ID>
    <DT>2009-01-01T00:00:00</DT>
  </t1>
  <t1>
    <ID>2</ID>
    <DT>2010-12-23T00:00:00</DT>
  </t1>
</NewDataSet>
Run Code Online (Sandbox Code Playgroud)

如果您不喜欢修改原始DataSet的DataColumns的想法,您可以复制它,然后在副本上调用该函数.


Joh*_*ers -1

DateTimeXML有一种标准格式。这就是将使用的格式WriteXml。如果您需要不同的格式,那么您不需要使用DateTime. 正如其他人所说,使用String代替。