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

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

(更喜欢 C# 中的答案)

输入示例:

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

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

有帮助吗?

解决方案

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

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

您可以自己完成这一切(在 龙之书, ,例如)或借助工具来实现效果,如下所示 关联.

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

其他提示

谷歌搜索显示 解析日期时间 库(与 钱德勒项目),它就是为了做到这一点而设计的。它是开源的(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 实现的并且没有使用任何花哨的东西,因此它很有可能与 铁蟒, ,因此您可以将其与 .net 一起使用。如果您特别想要一个 C# 解决方案,您可以根据他们使用的算法编写一些东西......

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

这可能不是很有帮助,因为你正在谈论 c#,但由于还没有人提到它,你可以尝试看看 php 的优秀且完全疯狂的本机 斯特托时间 功能

Ruby 开发者尝试用一个名为的解析器来解决这个问题 慢性的.

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top