【问题标题】:Parsing Timex Expressions in .NET Core在 .NET Core 中解析 Timex 表达式
【发布时间】:2018-10-01 14:57:38
【问题描述】:

使用 LUIS 引擎,我收到 XXXX-10-28 作为实体值中的日期。

我尝试使用 Chronic 进行解析,但 Chronic 不适用于 timex library/formats。

我期待以下字符串作为输入

  • XXXX-10-28 应该等同于 2018-10-28(未来)
  • 2018-10-02TMO 应等于 2018-10-02tomorrow

请注意XXXX-XX 代表YYYY-MM,但它没有numeric

是否有任何库或方法可以将此类字符串解析为ASP.NET Core 中的有效datetime 格式?

【问题讨论】:

  • Timex 是一个库,而不是一种格式。您发布的内容看起来像 YYYY-MM-DD,这是一种 ISO8601 日期格式,可以由 DateTime.Parse 开箱即用地解析。例如DateTime.Parse("2018-11-13") 将返回一个 DateTime 对象,其值为 2018 年 11 月 11 日
  • @PanagiotisKanavos Timex 实际上是一种格式。它被Datetimev2 prebuilt entity for LUIS 使用。 Find the spec here.
  • 请注意,2018-10-02TMO 不是明天,而是“2018 年 10 月 2 日上午”。

标签: c# asp.net-core botframework azure-language-understanding


【解决方案1】:

使用自定义格式模式:

using System;
using System.Globalization;
class MainClass {
  public static void Main (string[] args) {
    var format = "1234-10-30";
    var date = DateTime.ParseExact(format, "yyyy-MM-dd", CultureInfo.InvariantCulture);
    Console.WriteLine (date.ToString("dd/MM/yyyy"));
  }
}

Example

【讨论】:

  • 没有理由将ParseExactYYYY-MM-DD 一起使用
  • @PanagiotisKanavos 不过,如果这种格式是正确的,那将会是正确的,OP 通过他的例子暗示了这一点。
  • 我最初的评论是 OP 只询问如何解析字符串。如果有任何混合格式的可能性(因为涉及多个库?),代码应该确实验证输入
【解决方案2】:

您可以使用 Microsoft.Recognizers.Text.DataTypes.TimexExpression 包 from NuGet。它是 Microsoft 识别器文本项目 here on github

的一部分

我找到了两种使用这个库的方法:

使用 TimexProperty 解析表达式并自己猜测年份:

var parsed = new Microsoft.Recognizers.Text.DataTypes.TimexExpression.TimexProperty("XXXX-10-28");
Console.WriteLine(parsed.Year); // = null
Console.WriteLine(parsed.Month); // = 28
Console.WriteLine(parsed.DayOfMonth); // = 10

使用 TimexResolver 解析时间

var resolution = Microsoft.Recognizers.Text.DataTypes.TimexExpression.TimexResolver.Resolve(new [] { "XXXX-10-28" }, System.DateTime.Today)

resolution.Values 将包含一个数组,其中包含两个分辨率条目,一个用于该日期的上一次出现,一个用于该日期的下一次出现(基于您传递给 Resolve 方法的 DateTime。

请注意,从个人经验和我在 github 上看到的情况来看,在撰写本文时,这个包可以是 buggy 并带有更高级的表达式。

【讨论】:

    【解决方案3】:

    您可以使用DateTime.TryParseDateTime.TryParseExact 以及custom date/time format string 来完成此操作。

    根据您的示例,我认为您想要的格式字符串是 yyyy-MM-dd,尽管您可能需要稍微调整一下。

    例子:

    var input = "2018-10-28";
    var format = "yyyy-MM-dd";
    DateTime parsed;
    if (DateTime.TryParseExact(input, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out parsed))
    {
        // Do whatever you want with "parsed"
    }
    

    【讨论】:

    • YYYY-MM-DD可以直接被DateTime.Parse()解析
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-02
    • 2017-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多