如何解析相对时间?

Lar*_*nal 12 c# language-agnostic time parsing

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

鉴于相对时间的一些人为输入,你如何解析它?默认情况下,您将偏移DateTime.Now(),但可以选择从另一个偏移DateTime.

(首选C#中的答案)

输入示例:

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

编辑: 我们假设我们可以在输入上定义一些限制.这种代码在网络上是有用的.

dF.*_*dF. 7

Google搜索会显示解析时间库(与Chandler项目相关联),该库旨在完成此操作.它是开源的(Apache许可证),用Python编写.它似乎相当复杂 - 从主页:

parsedatetime能够解析,例如,以下内容:

* 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
Run Code Online (Sandbox Code Playgroud)

由于它是用纯Python实现的,并没有使用任何花哨的东西,因此很有可能它与IronPython兼容,因此你可以将它与.net一起使用.如果你想要专门的C#解决方案,你可以根据他们使用的算法写一些东西......

它还附带了一大堆单元测试.


Vin*_*vic 3

这就是构建用于日期处理的 DSL(领域特定语言)。我不知道是否有人为 .NET 做过这样的事情,但 DSL 的构建相当简单:

  1. 准确定义语言,您将接受哪些输入形式以及您将如何处理歧义
  2. 构建语言的语法
  3. 构建有限状态机,将您的语言解析为可操作的 AST

您可以自己完成所有这些工作(例如,在《龙之书》的帮助下)或借助工具来完成所有这些工作,如本链接所示。

只要认真思考各种可能性,借助优秀的 UI 示例,您就有很好的机会覆盖应用程序将收到的实际输入的一半以上。如果您的目标是接受人类可能输入的所有内容,则可以记录被确定为不明确的输入,然后在可以解释的时候将它们添加到语法中,因为有些东西本质上是不明确的。