如何解析相对时间?

时间:2020-03-05 18:51:07  来源:igfitidea点击:

这个问题是问题的另一面,询问"如何计算相对时间?"。

给定相对时间的人工输入,我们如何解析呢?默认情况下,我们将从" DateTime.Now()"偏移,但可以选择与另一个" DateTime"偏移。

(最好用C#回答)

输入示例:

  • "在20分钟内"
  • "5小时前"
  • " 3h 2m"
  • "下周"

编辑:假设我们可以在输入中定义一些限制。这类代码在网络上发布将是一件有用的事情。

解决方案

回答

这正在建立用于日期处理的DSL(特定于域的语言)。我不知道是否有人为.NET做过一个,但是DSL的构建非常简单:

  • 准确定义语言,我们将接受的输入形式以及对歧义的处理方式
  • 构建语言的语法
  • 构建将语言解析为可行的AST的有限状态机

我们可以自己完成所有操作(例如,在《龙之书》的帮助下)或者通过效果工具进行此操作,如此链接所示。

仅通过认真考虑各种可能性,借助良好的UI示例,我们就有机会覆盖应用程序将收到的实际输入的一半以上。如果我们希望接受人类可能键入的所有内容,则可以记录确定为歧义的输入,然后在可以解释它们时将它们添加到语法中,因为有些事物本来就是歧义的。

回答

这:http://www.codeproject.com/KB/edit/dateparser.aspx
与我们要完成的目标相当接近。这不是最优雅的解决方案,但是肯定可以为我们节省一些工作。

回答

Google搜索打开了parsedatetime库(与Chandler项目相关联),该库正是为此目的而设计的。它是开源的(Apache许可证),并且是用Python编写的。从首页来看,它似乎相当复杂:

parsedatetime is able to parse, for
  example, the following:

* Aug 25 5pm
* 5pm August 25
* next saturday
...
* tomorrow
* next thursday at 4pm
* at 4pm
* eod
* in 5 minutes
* 5 minutes from now
* 5 hours before now
* 2 days from tomorrow

由于它是在纯Python中实现的,并且没有使用任何花哨的东西,因此很有可能与IronPython兼容,因此可以在.net中使用它。如果我们特别想要Csolution,则可以根据他们使用的算法来编写一些东西...

它还带有大量的单元测试。

回答

红宝石人们试图用一个叫做"慢性"的解析器来解决这个问题。

  • 慢性RDocs
  • GitHub上的慢性

最近,我观看了一段内容丰富的视频演示,介绍了作者如何解决这个问题。

  • 慢性介绍(圣地亚哥红宝石旅)

回答

由于我们正在谈论cbut,所以这可能并没有什么用处,但由于没有人提及它,我们可以尝试看看php的出色且完全疯狂的本机strtotime函数