【问题标题】:Getting dates with multiple possible formats from a string in C#从 C# 中的字符串获取具有多种可能格式的日期
【发布时间】:2017-01-14 19:15:28
【问题描述】:

我对 C# 还很陌生。

我必须构建一个脚本来读取字符串并尝试将其转换为日期。

问题是:

-日期有不同的格式。 (国际、美国、日本)

-日期带有不同的分隔符,或者根本没有。

-这一年可能是完整的或只有 2 个职位

我已经开始替换可能的分隔符:

dateinstring = dateinstring.Replace("-","");
dateinstring  = dateinstring.Replace(".","");
dateinstring = dateinstring.Replace("/","");

然后检查长度以查看年份是否完整(例如 31102012 或 311012)

if(dateinstring.lenght = 8){
//check format with complete date
}else{
//check format with reduced year
}

现在我偶然发现了这个函数:DateTime.TryParseExact,它似乎做同样的事情,但它返回一个布尔值(真或假)而不是日期本身。

我错过了什么吗? C# 中是否有已经这样做的方法,或者我应该继续使用我的解决方案吗?

【问题讨论】:

标签: c# string date parsing


【解决方案1】:

这是我在内置解析失败时在项目中使用的一个函数 - 所以它只涵盖其他格式,而不是标准格式。

private DateTime? TryParseNumberString(string dateText)
{
    // additional date format options to be accepted
    var extraDateFormats = new[]
    {
        "d.M.",
        "d.M",
        "ddMMyyyy",
        "ddMMyy",
        "ddM"
    };
    foreach (var item in extraDateFormats)
    {
        DateTime test;
        if (DateTime.TryParseExact(dateText, item, null, System.Globalization.DateTimeStyles.AssumeLocal, out test))
        {
            return test;
        }
    }
    return null;
}

该方法基本上是,我想到了一些我想要支持的额外日期表示和评估顺序,以便根据我的意愿评估模棱两可的字符串。

根据您的要求,您可以更改格式字符串数组,并可能添加特定的文化,以防您希望支持带有书面日/月的长日期格式。

您也可以尝试DateTime.TryParse(input, culture, DateTimeStyles.None, out result) 使用不同的culture 值,以便按照惯例尝试解析英语、日语和其他语言。

【讨论】:

  • 为什么不使用the overload of DateTime.TryParseExact(),它可以让您传递一组日期格式来尝试?
  • @MatthewWatson 实际上,您的评论可能是正确的,但如果多种格式匹配相同的字符串,我现在找不到任何保证评估顺序的文档。
  • 是的,文档对此不是很明确,但是如果您检查 referencesource 上的源代码,您会发现它以明显的方式循环(即按照数组中项目的顺序)
猜你喜欢
  • 1970-01-01
  • 2019-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-28
  • 1970-01-01
相关资源
最近更新 更多