从给定的日期字符串中提取DateTime格式

时间:2018-05-21 23:11:44

标签: c#

我想知道是否有办法从给定的日期字符串中提取DateTime格式。在C#中 例如:

var dateString = "12/10/2018";
var format = GetDateFormat(dateString);

然后格式就像'长日期'或其他什么。

3 个答案:

答案 0 :(得分:1)

通过硬编码或反射(如下所示),您可以检索名称以"Pattern"结尾的所有properties of the DateTimeFormatInfo class的值,然后尝试使用这些模式进行解析并查看哪些模式成功。然后,您将被限制为该类提供的模式以及您选择使用的任何文化。

DateTimeFormatInfo formatInfo = DateTimeFormatInfo.CurrentInfo;
IEnumerable<PropertyInfo> patternProperties = formatInfo.GetType().GetProperties()
    .Where(property => property.Name.EndsWith("Pattern"));

foreach (PropertyInfo patternProperty in patternProperties)
{
    string pattern = (string) patternProperty.GetValue(formatInfo);
    bool wasParsed = DateTime.TryParseExact(dateString, pattern, formatInfo, DateTimeStyles.None, out DateTime _);

    Console.WriteLine($"{patternProperty.Name} (\"{pattern}\"): {wasParsed}");
}

在我的系统(en-US)上,上面的代码产生以下输出:

FullDateTimePattern ("dddd, MMMM d, yyyy h:mm:ss tt"): False
LongDatePattern ("dddd, MMMM d, yyyy"): False
LongTimePattern ("h:mm:ss tt"): False
MonthDayPattern ("MMMM d"): False
RFC1123Pattern ("ddd, dd MMM yyyy HH':'mm':'ss 'GMT'"): False
ShortDatePattern ("M/d/yyyy"): True
ShortTimePattern ("h:mm tt"): False
SortableDateTimePattern ("yyyy'-'MM'-'dd'T'HH':'mm':'ss"): False
UniversalSortableDateTimePattern ("yyyy'-'MM'-'dd HH':'mm':'ss'Z'"): False
YearMonthPattern ("MMMM yyyy"): False

答案 1 :(得分:0)

您可以使用一组预定义格式尝试DateTime.TryParseExact。那些匹配的将是您正在寻找的格式。

答案 2 :(得分:0)

没有内置功能或任何东西,但你可以自己写一个。这是一个简短的例子,它检查三种可能的格式;只需添加到列表中,您就可以添加更多内容。

如果您需要支持不寻常的格式(例如DateTime.Parse()无法自动检测的格式,那么您可能需要使用DateTime.ParseExact()测试输入的稍微不同的解决方案,例如BACON&回答。

public class Program
{
    //Returns a string indicating the format of the input, or null if could not be detected
    public static string GetDateTimeFormatCode(string dateTimeString)
    {
        //Parse the input
        DateTime dateTime;
        if (!DateTime.TryParse(dateTimeString, out dateTime)) return null;

        return
        (
            new string[]
            {
                "M/d/yyyy",
                "d MMM yyyy",
                "d MMMM yyyy",
                "dddd MMMM d yyyy"
            }
        )
        .Where( c => dateTime.ToString(c) == dateTimeString )
        .FirstOrDefault();
    }

    public static void Main()
    {
        var tests = new List<string>
        {
            @"21 May 2018",
            @"6/21/2018",
            @"Monday May 21 2018"
        };

        foreach (var t in tests)
        {
            Console.WriteLine("Input '{0}' uses format '{1}'", t, GetDateTimeFormatCode(t) ?? "?");
        }

    }
}

输出:

Input '21 May 2018' uses format 'd MMM yyyy'
Input '6/21/2018' uses format 'M/d/yyyy'
Input 'Monday May 21 2018' uses format 'dddd MMMM d yyyy'

Code on DotNetFiddle