ParseExact没有解析字符串的日期,日期与序数但没有年份

时间:2014-11-02 08:40:34

标签: c# .net parsing datetime ordinal-indicator

我已经回顾了Parse very long date format to DateTime in C#的答案,它解决了我的问题,但是我担心我可能会遇到一个无关的问题,因此打开了这个新线程。

日期作为一个我无法控制的字符串进入我的过程。它们总是代表未来的日期。一个例子是" Wednesday 26th November at 18:30"。注意,这一天有一个序数,而且没有一年。

我需要将它们变成DateTime结构,这样我才能......好吧,向他们做DateTime个事情!

我目前正在使用以下代码段(根据前面提到的问题进行调整),但它仍然在最后一个条件失败,我希望它能够通过。

public DateTime ParseOrdinalDateTime(string dt)
{
    DateTime d;
    if (DateTime.TryParseExact(dt, "dddd d\"st\" MMMM \"at\" hh:mm", null, DateTimeStyles.AssumeLocal, out d))
        return d;
    if (DateTime.TryParseExact(dt, "dddd d\"nd\" MMMM \"at\" hh:mm", null, DateTimeStyles.AssumeLocal, out d))
        return d;
    if (DateTime.TryParseExact(dt, "dddd d\"rd\" MMMM \"at\" hh:mm", null, DateTimeStyles.AssumeLocal, out d))
        return d;
    if (DateTime.TryParseExact(dt, "dddd d\"th\" MMMM \"at\" hh:mm", null, DateTimeStyles.AssumeLocal, out d))
        return d;

    throw new InvalidOperationException("Not a valid DateTime string");
}

3 个答案:

答案 0 :(得分:3)

如果您正在接收24小时格式时间,那么您应该将字符串解析为"dddd d\"th\" MMMM \"at\" HH:mm"(注意大写的Hs)。

答案 1 :(得分:1)

1)将hh:mm换成HH:mm(使用24小时......)
2)将文化设置为en-US

string dateString = "Wednesday 26th November at 18:30";  
string format = "dddd d\"th\" MMMM \"at\" HH:mm";  
DateTime dt;
DateTime.TryParseExact(dateString, format, new CultureInfo("en-US"), DateTimeStyles.AssumeLocal, out dt);

string dateString = "Wednesday 26th November at 18:30"; string format = "dddd d\"th\" MMMM \"at\" HH:mm"; DateTime dt; DateTime.TryParseExact(dateString, format, new CultureInfo("en-US"), DateTimeStyles.AssumeLocal, out dt);

编辑 - 格式化

答案 2 :(得分:1)

您的格式字符串有点偏离,您需要设置文化:

private static void Main(string[] args)
{
    DateTime result = ParseOrdinalDateTime("Friday 29th August at 18:30");
}

public static DateTime ParseOrdinalDateTime(string dt)
{
    DateTime d;

    if (DateTime.TryParseExact(dt, "dddd d\"th\" MMMM \"at\" HH:mm",  CultureInfo.CreateSpecificCulture("en-GB"), DateTimeStyles.AssumeLocal, out d))
    {
        return d;
    }

    throw new InvalidOperationException("Not a valid DateTime string");
}