我在使用DateTime.Parse
我正在处理各种日期格式,其中一些格式为January 11th
或February 22nd
,依此类推。
DateTime.Parse
会在尝试解析这些日期时抛出异常。
我想知道在DateTime中是否存在我缺少的内置功能,就像我可以设置的标志,这将使Parse以更可接受的方式运行。
我知道这可以用一个相对简单的正则表达式解决,而且我已经有一个模糊匹配我写的日期的类,但是我想知道是否有内置的方法来执行这种提取因为从长远来看,维护它比重新发明轮子更容易。
答案 0 :(得分:14)
.Net框架中没有内置任何内容来解析January 11th or February 22nd
等格式的日期。您必须删除后缀字符,然后才能使用DateTime.TryParseExact
。
对于使用后缀st
,th
的日期,您可以使用string.Replace
删除该部分,然后使用DateTime.TryParseExact
。喜欢。
string str = "1st February 2013";
DateTime dtObject;
string replacedStr = str.Substring(0,4)
.Replace("nd","")
.Replace("th","")
.Replace("rd","")
.Replace("st","")
+ str.Substring(4);
if (DateTime.TryParseExact(replacedStr,
"dd MMMMM yyyy",
CultureInfo.InstalledUICulture,
DateTimeStyles.None,
out dtObject))
{
//valid date
}
对于多种格式,您可以在字符串数组中指定格式,稍后您可以使用它。它返回bool
值,指示解析是否成功。
来自MSDN的示例:
string[] formats= {"M/d/yyyy h:mm:ss tt", "M/d/yyyy h:mm tt",
"MM/dd/yyyy hh:mm:ss", "M/d/yyyy h:mm:ss",
"M/d/yyyy hh:mm tt", "M/d/yyyy hh tt",
"M/d/yyyy h:mm", "M/d/yyyy h:mm",
"MM/dd/yyyy hh:mm", "M/dd/yyyy hh:mm"};
string[] dateStrings = {"5/1/2009 6:32 PM", "05/01/2009 6:32:05 PM",
"5/1/2009 6:32:00", "05/01/2009 06:32",
"05/01/2009 06:32:00 PM", "05/01/2009 06:32:00"};
DateTime dateValue;
foreach (string dateString in dateStrings)
{
if (DateTime.TryParseExact(dateString, formats,
new CultureInfo("en-US"),
DateTimeStyles.None,
out dateValue))
Console.WriteLine("Converted '{0}' to {1}.", dateString, dateValue);
else
Console.WriteLine("Unable to convert '{0}' to a date.", dateString);
答案 1 :(得分:13)
这是一个非常古老的问题,但对于仍然在研究复杂的自然语言日期解析的人,我建议使用nChronic,这是一个令人惊叹的(基于ruby的)慢性日期解析器的.NET端口。
它的来源是: nChronic Github
它也是Nuget的慢性病:Chronic in Nuget
使用此库的一些非常简单的示例代码如下:
using Chronic;
var parser = new Chronic.Parser ();
Span ParseObj;
DateTime ParsedDateTime;
ParseObj = parser.Parse ("January 11th");
ParsedDateTime = ParseObj.Start;
以下是一些可以处理的例子:
<强>简单强>
<强>复合强>
具体日期
特定时间(上述许多内容增加了时间)
等
答案 2 :(得分:1)
我在这里遇到过类似的问题
stringdate="August 19th 2000"
string pattern = @"\b(\d+)(?:st|nd|rd|th)\b";
Regex rgx = new Regex(pattern);
DateTime.Parse(String.Format("{0:MMMM, d, yyyy}", rgx.Replace(stringdate, "$1"))
**result** {19/08/2000 00:00:00} System.DateTime
来自Microsoft和regex to remove ordinals以及How can I visualize the way various DateTime formats will display?