【发布时间】:2021-02-12 16:11:00
【问题描述】:
您好,我有一个解析列的方法,属于 DataTable ,从字符串到 DateTime,此方法接受不同格式的日期作为参数。另一个类正在继承此方法,所以我不想更改它,因为它们工作正常。我的问题是为什么在 s="31/1/2021" 和 format="dd/MM/yyyy" 的情况下转换失败?
PD:我把方法代码放在这里
protected async Task<DataTable> ReplaceDateColumn(DataTable dataTable, int indexColumn, string nameNewColumn, string formatDate)
{
return await Task.Run(() => ReplaceDateColumnOperation(dataTable, indexColumn, nameNewColumn, formatDate));
}
private DataTable ReplaceDateColumnOperation(DataTable dataTable, int indexColumn, string nameNewColumn, string formatDate)
{
dataTable.Columns.Add(nameNewColumn, typeof(DateTime));
foreach (DataRow row in dataTable.Rows)
{
string format = formatDate;
DateTime date;
string s = row[indexColumn].ToString();
if (DateTime.TryParseExact(s, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out date))
{
row[dataTable.Columns.Count - 1] = date;
}
}
dataTable.Columns.RemoveAt(indexColumn); //reomve string date
dataTable.Columns[nameNewColumn].SetOrdinal(indexColumn); //set new column DateTime to first column
return dataTable;
}
【问题讨论】:
-
MM表示月份的 两个 地方。含义:01而不是1 -
补充 @FranzGleichmann 所说的,如果您一个月只使用 1 个地方,那么您正在寻找
M。 Full list here -
这段代码有什么意义?
row[indexColumn].ToString()似乎将现有日期格式化为字符串,然后DateTime.TryParseExact尝试使用 不同 格式(特别是美国格式)将字符串解析回原始日期。这肯定会在除美国以外的任何地方失败 -
如果列包含日期为
DateTime,则只需将其转换为:DateTime d = (DateTime)row[indexColumn];。然后这个配对问题就消失了! -
@TimSchmelter 在这种情况下,演员阵容会更好。至少它可以防止意外转换为字符串。我怀疑
ToString()被使用了,因为很多快速和肮脏的论坛帖子都使用它而不是投射