解析DateTime格式以获取格式字符串

ron*_*nag 5 c# datetime parsing format-string

我希望能够从DateTime字符串中获取格式字符串.

例如

"2012-12-08 15:00:00"=>"yyyy-MM-dd HH:mm:ss"

"2013/30/01 16:00"=>"yyyy/dd/MM HH:mm"

这可能吗?

Jon*_*eet 8

这将是很难做到这一点在一个完全普遍的方式,但其中一个方案是提取相关DateTimeFormatInfo的是你感兴趣的(使用CultureInfo.DateTimeFormat),从提取特定的文化模式(LongDatePattern,LongTimePattern等),适当结合模式在某些情况下(例如ShortDatePattern空间ShortTimePattern),然后依次尝试每个模式DateTime.TryParseExact- 记住每次仍然指定文化,以便适当地处理日期分隔符等.

DateTime.TryParseExact回报true,你知道你已经有了一个将解析给定的文本模式.

示例代码 - 包括显示您希望它可以工作的示例,但它不会:

using System;
using System.Collections.Generic;
using System.Globalization;

class Test
{
    static void Main()        
    {
        var us = new CultureInfo("en-US");
        var uk = new CultureInfo("en-GB");
        string text = "07/06/2013 11:22:11";

        // This one fails, as there's no appropriate time format
        Console.WriteLine(GuessPattern(text, us));
        // This one prints dd/MM/yyyy HH:mm:ss
        Console.WriteLine(GuessPattern(text, uk));
    }

    static string GuessPattern(string text, CultureInfo culture)
    {
        foreach (var pattern in GetDateTimePatterns(culture))
        {
            DateTime ignored;
            if (DateTime.TryParseExact(text, pattern, culture,
                                       DateTimeStyles.None, out ignored))
            {
                return pattern;
            }
        }
        return null;
    }

    static IList<string> GetDateTimePatterns(CultureInfo culture)
    {
        var info = culture.DateTimeFormat;
        return new string[]
        {
            info.FullDateTimePattern,
            info.LongDatePattern,
            info.LongTimePattern,
            info.ShortDatePattern,
            info.ShortTimePattern,
            info.MonthDayPattern,
            info.ShortDatePattern + " " + info.LongTimePattern,
            info.ShortDatePattern + " " + info.ShortTimePattern,
            info.YearMonthPattern
            // Consider the sortable pattern, ISO-8601 etc
        };        
    }
} 
Run Code Online (Sandbox Code Playgroud)

您可能会对您希望工作的某些"额外"日期和时间格式进行硬编码.

编辑:要处理歧义,您可以轻松地GuessPattern返回IEnumerable<string>而不是单个字符串:

static IEnumerable<string> GuessPatterns(string text, CultureInfo culture)
{
    DateTime ignored;
    return GetDateTimePatterns(culture)
        .Where(pattern => DateTime.TryParseExact(text, pattern, culture,
                                             DateTimeStyles.None, out ignored))
    }
}
Run Code Online (Sandbox Code Playgroud)