.NET的自然语言日期/时间解析器?
有谁知道类似于Ruby的Chronic的.NET日期/时间解析器(处理"明天"或者"下周四3pm"之类的东西)吗?
注意:我确实写过Ruby(这是我对Chronic的了解),但是该项目必须使用.NET。
解决方案
回答
我不知道一个,但这听起来像是一个很酷的问题,所以这是我的重口味(VB.NET):
Private Function ConvertDateTimeToStringRelativeToNow(ByVal d As DateTime) As String Dim diff As TimeSpan = DateTime.Now().Subtract(d) If diff.Duration.TotalMinutes < 1 Then Return "Now" Dim str As String If diff.Duration.TotalDays > 365 Then str = CInt(diff.Duration.TotalDays / 365).ToString() & " years" ElseIf diff.Duration.TotalDays > 30 Then str = CInt(diff.TotalDays / 30).ToString() & " months" ElseIf diff.Duration.TotalHours > 24 Then str = CInt(diff.Duration.TotalHours / 24) & " days" ElseIf diff.Duration.TotalMinutes > 60 Then str = CInt(diff.Duration.TotalMinutes / 60) & " minutes" Else str = CInt(diff.Duration.TotalMinutes).ToString() & " minutes" End If If str.StartsWith("1") Then str = str.SubString(0, str.Length - 1) If diff.TotalDays > 0 Then str &= " ago" Else str &= " from now" End If Return str End Function
它确实不像已经存在的那样复杂,但是我猜它可以正常工作。可能是一个不错的扩展方法。
回答
// @伯顿:我认为他的意思是相反的,至少从链接页面上的例子来看:
Chronic.parse('tomorrow') #=> Mon Aug 28 12:00:00 PDT 2006 Chronic.parse('monday', :context => :past) #=> Mon Aug 21 12:00:00 PDT 2006 Chronic.parse('this tuesday 5:00') #=> Tue Aug 29 17:00:00 PDT 2006
我以为我也会刺中它,直到我意识到! (虽然很好的实现)
回答
我没有,但是有一个名为jchronic的Java端口。如果没有别的,它可以为我们自己提供一个很好的起点。或者,我们可以使用像Octopus这样的半自动Java到Ctranslator来帮助翻译它。 (或者更好的东西,如果有人知道的话。)
好的,另一种可能的途径:我们可以通过IronRuby使用长期代码吗?
回答
@布莱尔·康拉德好主意!我试图让Chronic在IronRuby下运行,但是依赖项存在一些问题,我不知道它是否已经准备好。
我在Codeplex(DateTimeEnglishParser)上找到了一个试图做同样事情的项目。它尚无法解决很多年或者时间,但这是一个好的开始。我已经在该项目上做了一些工作,并贡献了一个补丁来更好地处理书面数字。
这是一个有趣的问题,并且绝对可以帮助我更好地理解正则表达式,因此我认为我将继续努力。
回答
之前有一个类似的线程,它提供了一个指向CodeProject上的库的链接,该链接似乎可以完成我们想要的操作:http://www.codeproject.com/KB/edit/dateparser.aspx,但是不幸的是,该库似乎是用MFC,因此我们必须使用它制作一个DLL,然后从.NET程序中调用它。
回答
我们完全按照我们在内部项目中寻找的内容进行开发。我们正在考虑是否有足够的必要将其公开。请查看此博客以获取更多详细信息:http://precisionsoftwaredesign.com/blog.php。
如果我们有兴趣,请随时与我联系:[email protected]
该库现在是SourceForge项目。该页面位于:
http://www.SourceForge.net/p/naturaldate
该程序集在下载部分,Mercurial提供了源代码。
回答
Palmsey,我最近有同样的要求,所以我继续写了一个简单的解析器。它不是最好的代码,但可以处理以下内容:
"今天下午2点"
" 2010年7月15日,星期二,下午2点,凌晨2点"
"上一年的凌晨2点,Tommorow,14:30"
" 2010年7月18日下午2:45"
将其粘贴在Codeplex上,因为也许其他人会发现它很有用。签出:http://timestamper.codeplex.com/