【问题标题】:Why this TryParseExact form string to DateTime fails? [closed]为什么这个 TryParseExact 表单字符串到 DateTime 失败? [关闭]
【发布时间】: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 个地方,那么您正在寻找 MFull list here
  • 这段代码有什么意义? row[indexColumn].ToString() 似乎将现有日期格式化为字符串,然后DateTime.TryParseExact 尝试使用 不同 格式(特别是美国格式)将字符串解析回原始日期。这肯定会在除美国以外的任何地方失败
  • 如果列包含日期为DateTime,则只需将其转换为:DateTime d = (DateTime)row[indexColumn];。然后这个配对问题就消失了!
  • @TimSchmelter 在这种情况下,演员阵容会更好。至少它可以防止意外转换为字符串。我怀疑ToString() 被使用了,因为很多快速和肮脏的论坛帖子都使用它而不是投射

标签: c# winforms


【解决方案1】:

亲爱的,你的字符串是 31/1/2021,你应该从左边用 '0' 和大小 2 填充字符 '1',比如 -> 31/01/2021,因为您的月份格式是“MM”。 如果您的数据是干净的,您可以将格式更改为 M。 但是,如果您有随机生成的 M 和 MM 格式的日期,您可以使用以下命令清理内存中的数据:

if (!string.IsNullOrWhiteSpace(s)) {
        s = string.Join('/',
            s.Trim().Split('/')
            .Select(token => token.PadLeft(2, '0'))
            .ToArray()
            );
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-31
    • 2011-01-02
    相关资源
    最近更新 更多