如何解析相对时间?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何解析相对时间?相关的知识,希望对你有一定的参考价值。

这个问题是问题的另一面,“How do I calculate relative time?”。

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

(首选C#中的答案)

输入示例:

  • “在20分钟内”
  • “5小时前”
  • “妈妈的妈妈”
  • “下周”

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

答案

那是为日期处理构建DSL(特定于域的语言)。我不知道是否有人为.NET做过一个但是DSL的构造相当简单:

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

你可以自己完成所有这些工作(例如在the Dragon Book的帮助下)或者使用工具来帮助实现效果,如link所示。

只需通过良好的UI示例,您就可以很好地考虑可能性,覆盖应用程序将获得的实际输入的一半以上。如果您的目标是接受人类可能输入的所有内容,您可以记录确定为含糊不清的输入,然后将它们添加到语法中,只要它们可以被解释,因为有些内容本身就是模棱两可的。

另一答案

谷歌搜索出现了parsedatetime库(与Chandler project相关联),它正是为此而设计的。它是开源的(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

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

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

另一答案

这可能不是那么有用,因为你正在谈论c#,但因为没有人提到它你可以尝试看看php的优秀和完全疯狂的本地strtotime功能

另一答案

红宝石人试图通过名为Chronic的解析器来解决这个问题。

我最近观看了一个关于作者如何解决这个问题的信息性视频演示。

另一答案

这:http://www.codeproject.com/KB/edit/dateparser.aspx非常接近你想要完成的事情。不是最优雅的解决方案,但肯定可以为您节省一些工作。

以上是关于如何解析相对时间?的主要内容,如果未能解决你的问题,请参考以下文章

NodeJs GraphQL 片段解析器

无法解析片段中的 ViewModelProvider 构造?

无法解析片段中的 findViewById [重复]

片段(Java) | 机试题+算法思路+考点+代码解析 2023

Relay.js 没有正确解析组合片段

从 XML 声明片段获取 XML 编码:部分内容解析不支持 XmlDeclaration