只是提供一个稍微不同的看法,并让您了解您拥有的其他一些选择;您可以将格式指定为 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。