27

有谁知道类似于Chronic for Ruby的 .NET 日期/时间解析器(处理“明天”或“下周四下午 3 点”之类的东西)?

注意:我确实编写了 Ruby(这就是我对 Chronic 的了解),但这个项目必须使用 .NET。

4

9 回答 9

12

我们开发的正是您在内部项目中寻找的东西。如果有足够的需要,我们正在考虑将其公开。请查看此博客了解更多详细信息:http: //precisionsoftwaredesign.com/blog.php

如果您有兴趣,请随时与我联系:contact@precisionsoftware.us

这个库现在是一个 SourceForge 项目。该页面位于:

http://www.SourceForge.net/p/naturaldate

该程序集位于下载部分,源代码可通过 Mercurial 获得。

于 2009-03-10T16:36:12.697 回答
6

存在 Chronic 的 .NET 端口。请参阅https://github.com/robertwilczynski/nChronic。我在这里创建了一个带有一些改进和错误修复的分支:https ://github.com/dorony/nChronic (已发送拉取请求,作者仍未回复)。

于 2015-05-06T10:55:23.700 回答
5

我不知道,但是有一个名为jchronic的 Java 端口。如果不出意外,它可以为您自己提供一个很好的起点。或者,也许您可​​以使用像Octopus这样的半自动 Java 到 C# 翻译器来帮助翻译它。(或者更好的东西,如果有人知道的话。)

好的,另一种可能的途径:您可以使用IronRuby使用慢性代码吗?

于 2008-08-23T12:18:29.043 回答
4

@Blair Conrad - 好主意!我试图让 Chronic 在 IronRuby 下运行,但在依赖方面遇到了一些问题——我不知道它是否已经准备好。

我在Codeplex ( DateTimeEnglishParser ) 上找到了一个尝试做同样事情的项目。它还不能处理几年或时间,但这是一个好的开始。我在这个项目上做了一些工作,并贡献了一个补丁来更好地处理书面数字。

这是一个有趣的问题,肯定帮助我更好地理解正则表达式,所以我想我会继续努力。

于 2008-08-28T15:11:55.963 回答
3

之前有一个类似的线程,它提供了一个指向 CodeProject 上的库的链接,该链接似乎可以满足您的要求: http: //www.codeproject.com/KB/edit/dateparser.aspx但不幸的是,该库似乎是用MFC,因此您必须使用它制作一个 DLL,然后从您的 .NET 程序中调用它。

于 2009-01-21T21:02:25.483 回答
3

Palmsey,我最近也有同样的需求,所以我继续写了一个简单的解析器。它不是最好的代码,但它会处理以下事情:

“今天下午 2 点” “星期二下午 2 点 - 2010 年 7 月 15 日凌晨 2 点” “去年凌晨 2 点 - 明天 14:30” “2010 年 7 月 18 日下午 2:45”

把它放在 codeplex 上,因为也许其他人会发现它有用。看看:http ://timestamper.codeplex.com/

于 2009-05-10T13:12:53.267 回答
3

我检查了几个框架,Python 的ParseDateTime效果最好。可以使用 IronPython 从 .NET 使用它。

如果有人对完整的示例项目感兴趣,请评论答案,我会尝试创建一个。

编辑

根据要求,这是一个可以与库一起使用的简单项目:

http://www.assembla.com/code/relativedateparser/subversion/nodes

尝试以下用例,例如:

  • 2008 年 8 月 25 日
  • 2008 年 8 月 25 日
  • 8 月 25 日下午 5 点
  • 8 月 25 日下午 5 点
  • 下个星期六
  • 明天
  • 下周四下午 4 点
  • 下午 4 点
  • 埃德
  • 明天凌晨
  • 星期二
  • eoy
  • 厄姆
  • 5分钟内
  • 5分钟后
  • 现在 5 小时前
  • 中午前 2 小时
  • 明天起2天
于 2011-12-20T06:35:58.307 回答
2

我不知道,但这听起来像是一个很酷的问题,所以这是我的重击(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

它确实不像已经存在的那样复杂,但我想它可以正常工作。可能是一个不错的扩展方法。

于 2008-08-23T01:41:34.220 回答
1

@Burton:我认为他的意思是另一种方式,至少从链接页面上的示例来看:

  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

我以为我也会尝试一下,直到我意识到!(虽然很好的实现)

于 2008-08-23T01:53:16.377 回答