2008-09-10 29 views
12

这个问题是提问“How do I calculate relative time?”的另一面。如何解析相对时间?

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

(不想在C#的答案)

示例输入:

  • “在20分钟内”
  • “10个小时前”
  • “3H2米”
  • “下周”

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

+0

对于.net有[解析日期C#的聪明的方式]答案(http://stackoverflow.com/a/25588407) – 2016-07-03 04:37:20

回答

3

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

  1. 精确定义的语言,输入表单,你会接受什么将为您做歧义
  2. 构建语法的语言
  3. 构建有限状态机,它分析你的语言转化为实际的AST

你可以做一切自己(与the Dragon Book的帮助,例如)或与帮助工具的效果,如显示n在这link

只要想好可能性,你就有很好的机会,在良好的UI示例的帮助下,覆盖超过一半的实际输入你的应用程序将收到。如果您的目标是接受人类可能输入的所有内容,那么您可以将确定的输入记录为不明确的,然后将它们添加到语法中,只要它们可以解释,因为这些内容会固有含糊不清。

+0

检查nChronic(https://github.com/robertwilczynski/nChronic)为.NET 。 – Larsenal 2012-02-02 21:51:30

7

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

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

+0

我成功地从C#中使用它,它工作得很好。如果有人有兴趣,我可以在任何地方上传。 – VitalyB 2011-12-20 06:27:41

0

这可能不是所有的帮助的,因为你说的C#,但因为没有人没有提到它,你可以尝试看看PHP的优秀,完全疯了本地strtotime功能