如何解析相对时间?

时间:2008-09-10 22:27:51

标签: c# parsing time language-agnostic

问题的另一方是“How do I calculate relative time?”。

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

(首选C#中的答案)

示例输入:

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

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

5 个答案:

答案 0 :(得分:7)

Google搜索会调出parsedatetime库(与Chandler project相关联),该库旨在完成此操作。它是开源的(Apache许可证),用Python编写。它似乎非常复杂 - 从主页:

  

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

* 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#解决方案,你可以根据他们使用的算法编写一些东西......

它还附带了大量的单元测试。

答案 1 :(得分:3)

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

  1. 精确定义语言,您将接受哪些输入表单以及您将采用歧义做什么
  2. 构建语言的语法
  3. 构建将您的语言解析为可操作的AST的有限状态机
  4. 您可以自己完成所有这些操作(例如,在the Dragon Book的帮助下)或在效果工具的帮助下,如link所示。

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:-1)

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