Просто чтобы предоставить sli ghtly different берут на себя это и дают вам представление о некоторых других вариантах, которые у вас есть; вы можете указать формат DateTime.Parse (или TryParse, как в моем примере), чтобы учитывать такие обстоятельства, не пытаясь «предварительно форматировать» строку во что-то еще с помощью String.Replace
вызовов и т. п .;
public DateTime ParseOrdinalDateTime(string dt)
{
string[] expectedFormats =
DateTime d;
if (DateTime.TryParseExact(dt, "dddd, d\"st\" MMMM yyyy", null, DateTimeStyles.None, out d))
return d;
if (DateTime.TryParseExact(dt, "dddd, d\"nd\" MMMM yyyy", null, DateTimeStyles.None, out d))
return d;
if (DateTime.TryParseExact(dt, "dddd, d\"rd\" MMMM yyyy", null, DateTimeStyles.None, out d))
return d;
if (DateTime.TryParseExact(dt, "dddd, d\"th\" MMMM yyyy", null, DateTimeStyles.None, out d))
return d;
throw new InvalidOperationException("Not a valid DateTime string");
}
Поэтому я бы предложить этот подход является то, что он излагает свои входные ожидания очень четко, и содержит поведение для одного метода. Если формат изменяется, вы можете просто указать здесь другую строку формата и создать новую строку строки даты.
Или небольшое отклонение от приведенного выше, принимая во внимание нижеследующие комментарии;
private static DateTime ParseOrdinalDateTime(string dt)
{
string[] expectedFormats = new[]
{
"dddd, d'st' MMMM yyyy",
"dddd, d'nd' MMMM yyyy",
"dddd, d'rd' MMMM yyyy",
"dddd, d'th' MMMM yyyy"
};
try
{
return DateTime.ParseExact(dt, expectedFormats, null, DateTimeStyles.None);
}
catch (Exception e)
{
throw new InvalidOperationException("Not a valid DateTime string", e);
}
}
Примечание: Единственная причина, я ловлю и бросить InvalidOperationException выше, чтобы защитить абонента от необходимости catch Exception
обрабатывать любые возможные исключения DateTime.ParseExact
могут бросить. Вы можете легко изменить этот API.
осторожно при удалении «st», если вы ожидаете августа. Попробуйте Regex.Replace («1 августа 2009», «([0-9]) (st | nd | rd | th)», «$ 1»); очевидно, используя вашу дату вместо строки, которую я использовал в качестве примера. – Steve