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