【问题标题】:How to exclude the date format from the list in C#如何从 C# 列表中排除日期格式
【发布时间】:2021-06-10 09:46:34
【问题描述】:

我想从输入中返回有效日期并将它们转换为特定格式,例如 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();     
}

【问题讨论】:

  • 使用TryParseExact,不用LINQ会更方便。
  • @Llama 尝试过,但也没有成功。
  • 你能澄清你所说的“它没有用”吗?如果TryParseExact 返回false,则它无法解析该值,因此您不应将其包含在列表中。否则,您可以将结果值包含在列表中。我不明白它怎么行不通?
  • @TomasTomov 也返回了一个无效的日期。 “20130720”这个日期应该从列表中删除,当我从列表中删除格式时,它会抛出一个异常,如“NotImplementaiton exception”
  • 又是这个问题,怎么把昨天的删了又重新发了?

标签: c# date-formatting c#-8.0


【解决方案1】:

使用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","dd/MM/yyyy","MM-dd-yyyy" };
private static readonly string targetFormat = "yyyyMMdd";

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

.Net Fiddle

【讨论】:

  • 祝你好运,我昨天给出了这个确切的解决方案,OP 说它也是错误的。不清楚操作员在问什么。
  • @zaggler 现在 OP 已经接受了。多么奇怪。
  • @Llama:不,不接受 :D 但是,我现在已经编辑了它,因为我认为我现在已经理解了他的要求。
  • OP 已经接受了它。但显然没有接受。如果我们的答案都不是可接受的解决方案,那么如果 OP 能够准确地阐明他们想要什么,那就太好了。
【解决方案2】:

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

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

Try it online

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

【讨论】:

    猜你喜欢
    • 2013-06-20
    • 2017-11-01
    • 2020-01-22
    • 1970-01-01
    • 2016-09-25
    • 1970-01-01
    • 1970-01-01
    • 2015-04-15
    • 2021-08-16
    相关资源
    最近更新 更多