12

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

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

(首选 C# 中的答案)

示例输入:

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

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

4

5 回答 5

7

谷歌搜索会找到 parsedatetime库(与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

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

它还带有一大堆单元测试。

于 2008-09-10T23:05:47.727 回答
3

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

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

您可以自己完成所有这些操作(例如,借助Dragon Book)或借助相关工具,如此链接所示。

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

于 2008-09-10T22:39:07.120 回答
0

ruby 人试图用一个叫做Chronic的解析器来解决这个问题。

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

于 2008-09-10T23:08:30.920 回答
0

这可能不是那么有帮助,因为你在谈论 c#,但由于没有人提到它,你可以尝试看看 php 的优秀且完全疯狂的原生strtotime函数

于 2008-09-10T23:12:52.500 回答
-1

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

于 2008-09-10T23:03:30.590 回答