将超长日期格式解析为C#中的DateTime
本文关键字:中的 DateTime 日期 格式 | 更新日期: 2023-09-27 18:23:51
如何将以下字符串日期解析为C#中的DateTime对象:
"1970年1月1日,星期四"
这是来自XML提要和DateTime.Parse似乎不喜欢在en-GB区域设置中使用它。订阅源只能来自英国服务器,所以我不担心全球化问题
我最初的暴力方法是:
- 删除逗号之前的所有内容(包括逗号)和尾部空格,留下"1970年1月1日"
- 然后删除"st"、"nd"、"rd"或"th"(视情况而定),留下"1970年1月1日"
- 然后将月份转换为其数字等效值,留下"1 1 1970"
- 然后将空格替换为"/",得到"1/1/1970"
我相信一定有一种更优雅的方式吧?我无法获得DateTime.Prse或DateTime.ParseExact来工作
我不认为DateTime
解析对序数有任何了解,但它应该能够处理其他一切。所以你可以使用:
public static string RemoveOrdinals(string input)
{
// Ugly but oh so simple.
return input.Replace("0th", "0")
.Replace("1st", "1")
.Replace("2nd", "2")
.Replace("3rd", "3")
.Replace("11th", "11") // Need to handle these separately...
.Replace("12th", "12")
.Replace("13th", "13")
.Replace("4th", "4")
.Replace("5th", "5")
.Replace("6th", "6")
.Replace("7th", "7")
.Replace("8th", "8")
.Replace("9th", "9");
}
然后:
string text = RemoveOrdinals(text);
DateTime date = DateTime.ParseExact(text, "dddd, d MMMM yyyy",
CultureInfo.GetCulture("en-GB"));
(作为一个快速插件,你当然只想要一个日期,而不是日期/时间。不幸的是,.NET没有一个类型来表示这一点,但你可以在我的Noda time库中使用LocalDate
。我们也不处理序数,所以你仍然需要额外的方法。不过,如果你想查看相关代码,请告诉我。)
只是提供一个稍微不同的看法,并让您了解其他一些选项;您可以将格式指定为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。
将DateTime.Parse
与特定于区域性的格式化程序一起使用
http://msdn.microsoft.com/en-us/library/kc8s65zs.aspx
首先反转这个答案的逻辑,从一个月的哪一天去掉"st"、"nd"等:
https://stackoverflow.com/a/4544313/2420979
然后正常使用DateTime.Parse
:
var result = DateTime.Parse("Thursday, 1 January 1970", new CultureInfo("en-GB"));