我有两个应用程序,第一个将DataSet导出到文件,第二个将该文件读取到DataSet。这两个应用程序都将CultureInfo设置为" en-US"以及DataSet.Locale是" en-US"。
在第一个应用程序中,我有DateTime字段:
dt.Columns.Add("DateCreated", typeof(DateTime));
而不是写入文件:
ds.WriteXml(fileName);
在第二个应用中:
ds.ReadXml(reader);
当我尝试从DataRow读取DateTime字段时:
DateTime? dateCreated = Convert.ToDateTime(dr["DateCreated"]);
它引发了异常:
' Convert.ToDateTime(DR [" dateCreated会"])'抛出类型' System.FormatException'与演员相同,或者当我指定CultureInfo时。当我指定使用Schema保存DataSet时,它也不会转换。
此字段中的日期值格式为:" 2017-06-11T08:10:06.2212339 03:00"
为什么会发生这种情况,是否可以在不指定DateFormat字符串的情况下将其转换为DateTime?谢谢!
答案 0 :(得分:0)
如果不在时区偏移部分使用正号或负号,则UTC日期字符串格式似乎不正确,并且会在给定消息DataRow
下抛出String date = (dr["DateCreated"] ?? String.Empty).ToString();
if (!String.IsNullOrEmpty(date))
{
date = date.Insert((date.Length - 5), "+");
// NB: Convert.ToDateTime will give same value as DateTime.ParseExact here
DateTime? dateCreated = DateTime.ParseExact(date, "yyyy-MM-ddTHH:mm:ss.FFFFFFF zzzz",
CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal);
}
:
date
如果dateCreated
给出的日期格式固定为正时间偏移并且您只想读取它们,请使用String.Insert
在偏移部分之前插入偏移符号,如下所示:
date: 2017-06-11T08:10:06.2212339 +03:00
dateCreated: 6/11/2017 5:10:06 AM
Object
&上的输出字符串string
应该是这样的(以UTC为基础):
DataRow
注意:Convert.ToDateTime
可能会在dr["DateCreated"]
输入的情况下使用DateTime? dateCreated = Convert.ToDateTime(dr["DateCreated"].ToString().Insert((date.Length - 6), "+"));
参数而不是{{1}},因此如果{{1}}肯定没有&#,此代码可能适用39; t有空值:
{{1}}
解析示例:.NET Fiddle Demo
相关问题:
Custom DateTime formats when using DataSet.WriteXml in .NET
Reading XML into Datatable gives incorrect DateTime when the time has Time Zone info