ParseExact не разбирает строку с днем, дата с порядковым номером, но без года

Я рассмотрел ответ на Parse очень длинный формат даты для DateTime в 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 ответа

Решение

Если вы получаете время в 24-часовом формате, то вам следует проанализировать строку как "dddd d\"th\" MMMM \"at\" HH:mm" (обратите внимание на заглавные буквы Hs).

1) Поменяйте местами чч: мм на чч: мм (используя 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);

редактировать - отформатирован

Ваша строка формата немного отключена, и вам нужно установить культуру:

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");
}
Другие вопросы по тегам