如何从 C# 中的列表中排除日期格式

问题描述

我想从输入中返回有效日期并将它们转换为特定格式,如 yyyyMMdd。我只想返回有效的日期格式

public static List<string> TransformDateFormat(List<string> dates)
{
         
        var formats = new string[]
        {
            "yyyy/MM/dd","dd/MM/yyyy","MM-dd-yyyy","dd.MM.yyyy"      
    };          
        return dates
            .Select(date => DateTime.ParseExact(date,formats,null).ToString("yyyyMMdd"))
            .ToList();     
}

解决方法

使用 DateTime.TryParseExact,它采用一组有效格式:

private static readonly string[] validFormats = {"yyyy/MM/dd","dd/MM/yyyy","MM-dd-yyyy"};

public static IEnumerable<string> TransformDateFormat(IEnumerable<string> dates)
{
        return dates
            .Where(date => DateTime.TryParseExact(date,validFormats,null,DateTimeStyles.None,out var dt));
}

var input = new List<string> { "2010/02/20","19/12/2016","11-18-2012","20130720" };
List<string> result = TransformDateFormat(input).ToList();
Console.Write(string.Join(Environment.NewLine,result));

您还应该为 IFormatProvider 参数添加一个参数。我使用了 null,意思是“当前文化”。你可以在那里传递任何文化。

.Net Fiddle

如果要将其转换为新格式,可以使用以下代码:

private static readonly string[] validFormats = {"yyyy/MM/dd","MM-dd-yyyy" };
private static readonly string targetFormat = "yyyyMMdd";

public static IEnumerable<string> TransformDateFormat(IEnumerable<string> dates)
{
        return dates
            .Select(date => DateTime.TryParseExact(date,out var dt) ? dt : new DateTime?())
            .Where(date => date.HasValue)
            .Select(date => date.Value.ToString(targetFormat));
}

.Net Fiddle

,

使用TryParseExact。我将在此处提供此答案,希望它可以解决您自己尝试时遇到的任何问题。

List<string> reformattedDates = new List<string>();
foreach (string date in dates)
{
    if (DateTime.TryParseExact(date,formats,CultureInfo.InvariantCulture,out DateTime parsedDate))
    {
        reformattedDates.Add(parsedDate.ToString("yyyyMMdd"));
    }
}
return reformattedDates;

Try it online

顺便说一下,问题中的示例似乎以原始格式返回日期,而您的代码以 yyyyMMdd 格式返回它们。如果您确实想以原始格式返回它们,则应使用 Tim's answer