使用数据集时自定义日期时间格式.. net中的WriteXml

本文关键字:格式 net 中的 WriteXml 时间 日期 数据集 自定义 | 更新日期: 2023-09-27 18:04:20

我遇到了一个问题,我正在编写一个数据集到XML,具有类型为DateTime的列,我想控制输出格式。

DataSet data = LoadDataSet();
data.Tables[0].Rows[0]["MyDate"] = DateTime.Now;
data.WriteXml(myFile);

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

2011-08-02T17:39:00-07:00

我想使用自定义日期格式,或者至少去掉时区信息。

是否有任何方法来控制DateTime列在我的数据集XML格式?

我的直觉说没有,因为我假设这样做是为了方便跨时区的数据转换,但我注意到,即使DateTime列标签省略了时区数据,我也可以成功读取DataSet XML,所以我希望我可以在写XML时做类似的事情。

使用数据集时自定义日期时间格式.. net中的WriteXml

如果您可以只去掉时区信息,那么这个解决方法可能适合您。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;
                }
            }
        }
    }

用法示例:

    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");
输出:

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>

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>

如果您不喜欢修改原始数据集的datacolums,您可以复制它,然后在副本上调用函数

对数据集应用XSLT转换:(from MSDN)(我相信你会找到转换DateTime格式的XSLT示例,或参阅关于XSLT和DateTime格式的SO帖子)

DataSet custDS = new DataSet("CustomerDataSet");
XmlDataDocument xmlDoc = new XmlDataDocument(custDS); 
XslTransform xslTran = new XslTransform();
xslTran.Load("transform.xsl");
XmlTextWriter writer = new XmlTextWriter("xslt_output.html", 
  System.Text.Encoding.UTF8);
xslTran.Transform(xmlDoc, null, writer);
writer.Close();

将数据时间转换为字符串的肮脏但简单的解决方案:

select concat(datetime_field,'') datetime_field from table_name

在XML中DateTime有一种标准格式。这是WriteXml将使用的格式。如果你需要一个不同的格式,那么你不需要使用DateTime。正如其他人所说,使用String代替。

如果文件是常规的,并且导出的XML看起来也是常规的,那么您可以使用简单的循环重写它。简单快捷的解决方案。如果你愿意,可以使用我的一些代码:

private void rewriteXML(string oldFile, string newFile, int startPos, int strLength)
        {
            try
            {
                File.Delete(newFile);
            }
            catch { Console.WriteLine("File didn't existed."); }
            StreamReader SR = new StreamReader(oldFile);
            string data;
            StreamWriter SW = new StreamWriter(newFile);
            while ((data = SR.ReadLine()) != null)
            {
                if (data.Contains("<start>"))
                {
                    string ln_tmp = data.Replace(" ", "");
                    string newline = "    <start>" + ln_tmp.Substring(startPos, strLength) + "</start>";
                    SW.WriteLine(newline);
                }
                else
                    SW.WriteLine(data);
            }
            SR.Close();
            SW.Close();
        }

输出如下:

<start>19:34</start>

代替:

<start>2013-03-17T19:34:00+01:00</start>