c# - 使用DateTime.ParseExact将字符串转换为datetime

时间:2016-05-19 20:33:00

标签: c# datetime

我必须将字符串提取从文件转换为datetime。问题是我的字符串没有唯一的格式。例如,我的字符串可以是:19-05-2016 1:24:09:560或19-05-2016 21:24:09:56或19-05-2016 10:24:09:560或19- 05-2016 10:24:09等等。我还没有遇到所有可能性(这些字符串是从API调用的json响应中提取出来的)

这就是我的代码的样子

public static DateTime ConveDateTime(string a)
{
    DateTime finished;
    try
    {
        finished = DateTime.ParseExact(a, "dd-MM-yyyy HH:mm:ss:fff", CultureInfo.InvariantCulture,
            DateTimeStyles.AssumeUniversal |
            DateTimeStyles.AdjustToUniversal);
    }
    catch (Exception)
    {
        try
        {
            finished = DateTime.ParseExact(a, "dd-MM-yyyy HH:mm:ss:ff", CultureInfo.InvariantCulture,
                DateTimeStyles.AssumeUniversal |
                DateTimeStyles.AdjustToUniversal);
        }
        catch (Exception)
        {
            try
            {
                finished = DateTime.ParseExact(a, "dd-MM-yyyy HH:mm:ss:f", CultureInfo.InvariantCulture,
                    DateTimeStyles.AssumeUniversal |
                    DateTimeStyles.AdjustToUniversal);
            }
            catch (Exception)
            {
                try
                {
                    finished = DateTime.ParseExact(a, "dd-MM-yyyy HH:mm:ss", CultureInfo.InvariantCulture,
                        DateTimeStyles.AssumeUniversal |
                        DateTimeStyles.AdjustToUniversal);
                }
                catch (Exception)
                {
                    try
                    {
                        finished = DateTime.ParseExact(a, "dd-MM-yyyy H:mm:ss:fff", CultureInfo.InvariantCulture,
                            DateTimeStyles.AssumeUniversal |
                            DateTimeStyles.AdjustToUniversal);
                    }
                    catch (Exception)
                    {
                        try
                        {
                            finished = DateTime.ParseExact(a, "dd-MM-yyyy H:mm:ss:ff", CultureInfo.InvariantCulture,
                            DateTimeStyles.AssumeUniversal |
                            DateTimeStyles.AdjustToUniversal);
                        }
                        catch (Exception)
                        {

                            finished = DateTime.ParseExact(a, "dd-MM-yyyy H:mm:ss:f", CultureInfo.InvariantCulture,
                            DateTimeStyles.AssumeUniversal |
                            DateTimeStyles.AdjustToUniversal);
                        }                            
                    }
                }
            }
        }
    }

    return finished;
}

我想知道在转换字符串方面是否有比使用我的解决方案更好的解决方案。

2 个答案:

答案 0 :(得分:8)

DateTime.ParseExact has an overload,它采用可能格式的字符串数组来进行解析。使用该重载并将代码减少到一两行。

string[] formats = new string[] {"dd-MM-yyyy HH:mm:ss:fff",
                                 "dd-MM-yyyy H:mm:ss:fff",
                                 "dd-MM-yyyy HH:mm:ss:f",
                                 "dd-MM-yyyy HH:mm:ss", 
                                 ....};

finished = DateTime.ParseExact(a, formats, CultureInfo.InvariantCulture,
                DateTimeStyles.AssumeUniversal |
                DateTimeStyles.AdjustToUniversal);

如果您不知道所有可能的格式,您也可以从外部文件中读取它们,以避免在弹出新格式时重新编译应用程序

另外,正如下面的评论所述,我更倾向于使用DateTime.TryParseExact来更好地控制解析的结果,并避免在格式无法识别的情况下进行代价高昂的异常处理。

答案 1 :(得分:1)

使用DateTime.Parse()而不是DateTime.ParseExact()怎么样? DateTime.Parse()比ParseExact更宽容。 这样您就不必定义所有可能的格式了吗?