【问题标题】:How to parse relative time?如何解析相对时间?
【发布时间】:2010-09-08 11:58:41
【问题描述】:

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

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

(首选 C# 中的答案)

示例输入:

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

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

【问题讨论】:

标签: c# parsing time language-agnostic


【解决方案1】:

Google 搜索会出现 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# 中成功使用了它,而且效果很好。如果有人有兴趣,我可以上传到某个地方。
【解决方案2】:

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

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

您可以自己完成所有这些工作(例如,在the Dragon Book 的帮助下)或借助相关工具,如link 所示。

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      Ruby 开发人员尝试使用名为 Chronic 的解析器来解决这个问题。

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

      【讨论】:

      • 一个视频链接会很棒。
      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 2010-12-27
        • 2010-11-17
        • 1970-01-01
        • 1970-01-01
        • 2021-10-04
        • 2010-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多