我从数据库填充数据。
它包含两个字段:DATE
,TIME
这两个字段都是datetime
列
我想迭代数据表并更改DATE
列的日期格式,即dd/MM/yyyy
int i = 0;
string d="";
foreach (DataRow dr in dataTable.Rows)
{
d = dr["DATE"].ToString();
DateTime date = Convert.ToDateTime(d);
d = date.ToString("dd/MM/yyyy");
dataTable.Rows[i]["DATE"] = d;
i++;
}
我收到以下错误
字符串未被识别为有效的DateTime。
无法在DATE列中存储<15/02/2015>
。预期类型是DateTime。我怎样才能实现它?
答案 0 :(得分:1)
嗯,您没有告诉我们 您是如何创建dataTable
的,而是我的想法......
如果您的DATE
和TIME
列都是DateTime
,那么您需要提供Datetime
个值。不是string
。
在.NET Framework中,DateTime
结构没有任何隐式格式。它只有日期和时间值。当您尝试对其进行格式化时,您会得到它的字符串表示形式。这就是为什么15/02/2015
在您的情况下将是string
,而不是DateTime
。
您的FormatException
方法获得Convert.ToDateTime
可能是因为您的d
值不是standard date and time format的CurrentCulture
。您可以使用DateTime.ParseExact
或DateTime.TryParseExact
方法使用自定义日期和时间解析。
string s = "15/02/2015";
DateTime dt;
if(DateTime.TryParseExact(s, "dd/MM/yyyy", CultureInfo.InvariantCulture,
DateTimeStyles.None,
out dt))
{
Console.WriteLine(dt);
}
即使您这样做,为什么还要将string
值保留在datetime
类型列中?这根本没有意义 。即使你这样做,因为.Rows
返回DataRowCollection
,你可能会得到 Collection被修改;枚举操作可能无法执行错误,因为您在迭代时尝试修改集合。
我建议您为字符串值创建另一个DataTable
,并将其添加到DateTime
值字符串表示形式为dd/MM/yyyy
格式,如;
int i = 0;
string d = "";
var stringDataTable = new DataTable();
stringDataTable.Columns.Add("DATE", typeof(String));
stringDataTable.Columns.Add("TIME", typeof(String));
foreach(DataRow dr in dataTable.Rows)
{
d = ((DateTime)dr["DATE"]).ToString("dd/MM/yyyy", CultureInfo.InvariantCulture);
stringDataTable.Rows[i]["DATE"] = d;
i++;
}