3

我已经查看了在 C# 中将非常长的日期格式解析为 DateTime的答案,它有助于解决我的问题,但我担心我可能会遇到一个不相关的问题,因此打开了这个新线程。

日期作为我无法控制的字符串进入我的流程。它们总是代表未来的一个日期。一个例子是“ 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");
}
4

3 回答 3

3

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

于 2014-11-02T08:45:55.683 回答
2

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);

编辑 - 格式化

于 2014-11-02T09:04:01.410 回答
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");
}
于 2014-11-02T09:33:27.577 回答