【问题标题】:Does anyone know what TimezoneOffset does on LuisPredictionOptions?有谁知道 TimezoneOffset 对 LuisPredictionOptions 做了什么?
【发布时间】:2020-01-12 04:44:06
【问题描述】:

我正在向 LUIS 发送一个基于时间值的查询(例如,“从现在开始 10 分钟后的时间是多少” - 只是一个示例)。我希望时间回到本地时区,因此在 LuisPredictionOptions 对象 (C#) 上,我设置了 TimezoneOffset(例如,我将其设置为提前 2 小时或 120 分钟)。

在 Fiddler 中,我可以看到它在调用 LUIS 端点时正确添加了“timezoneOffset=120.0”。

但是,时区返回为 UTC - timezoneOffset 是否设置,甚至设置为什么都没有关系,时间总是返回 UTC,使用内置的 datetimeV2 实体。

有人知道 TimezoneOffset 属性的用途吗?我只是使用不正确吗?是否有其他方法可以从 LUIS 获取当地时间?

[更新]:这里有一些例子:https://westus.api.cognitive.microsoft.com/luis/v2.0/apps/[AppId]?verbose=true&timezoneOffset=0&subscription-key=[subscriptionkey]&q=/luis/v2.0/apps/c1be57f4-3850-489e-8266-db376b82c011?timezoneOffset=120&log=true

https://westus.api.cognitive.microsoft.com/luis/v2.0/apps/[AppId]?verbose=true&timezoneOffset=0&subscription-key=[subscriptionkey]&q=/luis/v2.0/apps/c1be57f4-3850-489e-8266-db376b82c011?timezoneOffset=240&log=true

我正在尝试以下示例话语:“在 10 分钟内”。

当我这样做时,timex 为 UTC(例如 timex=2020-01-11T16:08:25),“value”返回相同的值,减去“T”,如下所示:value= 2020-01-11 16:08:25

如果 timex 是 UTC,我也许可以理解,但是“值”可能应该由 timezoneOffset 调整?

【问题讨论】:

  • 我认为您在这些示例网址中粘贴了错误的值作为查询
  • 谢谢凯尔 - 我明白了 - 请参阅下面的评论。我正在做一些手动测试,确实把这些 URL 弄乱了,但这是一个更广泛的问题的一部分,我最终解决了一些时间问题。
  • 那你会接受哈泽姆的回答吗?
  • 嗯,他对 url 的看法并不完全正确,当然它与 SDK 版本无关,所以不确定它是否 100%“接受”。不过,他确实帮助我找到了正确的方向,这就是为什么我赞成他的回答。这有意义吗?
  • 您没有提供足够的信息来发现实际问题,因此鉴于您提出的问题,他尽可能正确。但是,如果您不打算礼貌地接受他的回答,那么您应该发布自己的答案以便您接受。

标签: azure-language-understanding


【解决方案1】:

您的网址中似乎有一个不正确的问号,就在 timezoneOffset 之前。

使用相同的查询,我能够得到预期的行为,其中返回的值相差 10 分钟。

您使用的是哪个 SDK?也许您正在使用 V3 Runtime SDK,它使用不使用 timeZoneOffset 而是使用 datetimeReference 的 V3 端点,并且需要改用 V2 Runtime SDK。

https://westus.api.cognitive.microsoft.com/luis/v2.0/apps/[app-id]?verbose=true&timezoneOffset=10&subscription-key=[key]&q=in 10 minutes

【讨论】:

  • 你是对的,网址完全搞砸了——我有两个查询字符串来自一些错误的测试。最后,我找到了整体解决方案 - 我将 LUIS 时间、用户时间和运行机器人的服务器时间混合在一起。
【解决方案2】:

TimeZoneInfo 类的FindSystemTimeZoneById 方法可用于根据系统时间确定正确的 timezoneOffset。 C#中的一个例子如下所示:

// Get CST zone id
TimeZoneInfo targetZone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");

// Get local machine's value of Now
DateTime utcDatetime = DateTime.UtcNow;

// Get Central Standard Time value of Now
DateTime cstDatetime = TimeZoneInfo.ConvertTimeFromUtc(utcDatetime, targetZone);

// Find timezoneOffset
int timezoneOffset = (int)((cstDatetime - utcDatetime).TotalMinutes);

参考: https://docs.microsoft.com/en-us/azure/cognitive-services/luis/luis-concept-data-alteration?tabs=V2#c-code-determines-correct-value-of-timezoneoffset

【讨论】:

  • 这根本没有帮助,我担心 - 我已经这样做了,但它并没有发送我所期望的。例如,尝试以下调用:
猜你喜欢
  • 1970-01-01
  • 2022-12-17
  • 1970-01-01
  • 1970-01-01
  • 2016-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-29
相关资源
最近更新 更多