如何解析相对时间?
这个问题是问题的另一面,询问"如何计算相对时间?"。
给定相对时间的人工输入,我们如何解析呢?默认情况下,我们将从" 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函数