Этот обходной путь может подойти, если вы можете жить, просто удаляя информацию о часовом поясе.Значением по умолчанию для свойства DateTimeMode столбцов DateTime в DataSets является 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>
Если вам не нравится идея изменения столбцов DataColumns исходного набора данных, вы можете сделать копиюзатем вызовите функцию для копии.