【问题标题】:Bing Maps transit API: Am I formatting the query datetime incorrectly or parsing output datetime incorrectly?Bing Maps transit API:我是否错误地格式化查询日期时间或错误地解析输出日期时间?
【发布时间】:2015-03-24 23:46:29
【问题描述】:

我无法让 Bing Maps API 正常工作。我正在输入一个查询“我如何使用公共交通工具从安嫩代尔到伊斯特伍德(悉尼)?”并获得与我查询的时间完全不同的结果。

API 记录在这里:

https://msdn.microsoft.com/en-us/library/ff701717.aspx

这里:

https://msdn.microsoft.com/en-us/library/ff701718.aspx

文档未能指定响应的日期格式,但我认为这是正确的:

http://weblogs.asp.net/bleroy/dates-and-json

所以这是我的查询: http://dev.virtualearth.net/REST/V1/Routes/Transit?wp.0=-33.886620,151.171720&wp.1=-33.785780,151.075740&timeType=Departure&dateTime=11:43:00&maxSolns=3&output=json&key=(redacted)

请注意,出于显而易见的原因,我编辑了我们的 API 密钥。

请注意,我要的是上午 11:43 的巴士。我试过这个结合日期和没有日期,它没有区别。

我收到的回复乍一看似乎很有效,但它给了我这样的时间: "时间":"/日期(1427222880000-0700)/"

...如果我的查询时间是 5:43,这将是合理的,但事实并非如此。该日期格式清楚地表明“自 1970 年以来的毫秒数,UTC”(绝望中我尝试加减 7 小时,但没有任何意义)。文档清楚地表明我的 11:43 时间应该在当地时区中指定,即就像“11:43”一样。

假设 Bing 文档错误或实现错误,我尝试从查询时间中任意增加 6 小时或减少 18 小时(这需要在 URL 中添加日期),但我什么也没得到有道理。我的 API 结果与公共 Bing 浏览器应用程序之间没有任何对应关系。

我也找不到该向 Microsoft 询问谁。

有什么想法吗?

【问题讨论】:

  • 1427222880000 是格林威治标准时间 2015 年 3 月 24 日星期二 18:48:00。 0700 是华盛顿州雷德蒙德的当前时区。这是 2015 年 3 月 24 日 11:48:00,华盛顿州雷德蒙德。这没有意义吗?
  • 您是否尝试将时区添加到输入日期时间?
  • 我不在雷德蒙德,也不是我的出发地或目的地。根据 API 文档,没有规定将时区添加到输入参数“dateTime”,它始终被理解为相关纬度/经度的本地时间。你建议我尝试什么语法?
  • 我建议您尝试输出语法。毫秒+时间偏移。或尝试其中之一:msdn.microsoft.com/en-us/library/…
  • 输出语法给了我:,"dateTime: This parameter value has an invalid format."

标签: bing-maps


【解决方案1】:

我有以下可能可靠也可能不可靠的解决方案,它违反了规范,但现在可以:

  1. 将 0700 添加到时间戳,即将其转换为“负 7 小时”。如果有一个“+”而不是一个“-”,那么符号将被颠倒,尽管我怀疑加号从未使用过(不知道他们如何改变符号)。

  2. 减去悉尼的时区偏移量,即 -11 小时(即加 11 小时)。

这给了我一些我可以放入 Java 'Date' 实例的东西,即“new Date(x)”,它代表一个独立于任何时区的时间。

我希望我可以使用“自 UTC 以来的毫秒数”而忽略“0700”,因为我们的系统以“自 UTC 以来的毫秒数”存储这些时间,但我无法让它工作。

一切都与 Bing 错误解析悉尼 GTFS 文件的假设一致,将它们解释为雷德蒙德时间而不是悉尼时间。

【讨论】:

    【解决方案2】:

    如 cmets 中所述,返回的日期信息是正确的。 JSON 响应中返回的 DataTime 值的格式为 OData DateTime:

    “/Date([ticks][“+” | “-” ][offset])/”
    

    [ticks] = 自 1970 年 1 月 1 日午夜以来的毫秒数

    [offset] = 添加或减去的分钟数

    您可以在此处找到相关文档:http://www.odata.org/documentation/odata-version-2-0/JSON-format/

    【讨论】:

    • 日期信息与我给的输入 dateTime 没有任何意义(悉尼时间 11:43 --> 第一班车是雷蒙德时间 11:48?)因此我假设我使用了不正确的输入时间。你知道我应该为输入时间指定什么吗? API 明确指出“11:43”将被解释为“本地”时间,因此这似乎是一个错误或不正确的文档。
    • 正如 Jayen 所说,返回的时间是当地时间上午 11:48,这是有道理的。
    • @rbrunditt 这没有意义。当您使用“本地时间”一词时,我什至不知道您指的是哪个时区 - 悉尼时间?雷蒙德时间?雷德蒙德时间如何被视为“本地”时间?你看过我上面的评论吗?现在,Bing 告诉我“13 小时内没有公共汽车”。
    • “本地时间”是运输提供商运营的时间。即,如果您在悉尼搜索路线并在下午 1 点的时间通过,那么它将是悉尼时间下午 1 点。 JSON 响应将返回一个 OData dateTime 对象,该对象具有自 1970 年 1 月 1 日以来的刻度和时区偏移量。有关更多信息,请参阅:stackoverflow.com/questions/3818719/…
    • @rbrunditt 好的,谢谢。所以 Bing 真的是在说 13 小时 5 分钟没有公共汽车。你用过这个 Bing API 吗?它对你有用吗?
    【解决方案3】:

    你给的第二个链接说:

    JSON 响应以 DateTime 字符串的形式返回出发和到达时间,例如 1318005467000-0700。字符串中的第一个整数 (1318005467000) 表示自 1970 年 1 月 1 日午夜 12:00:00 UTC 以来的秒数。字符串的其余部分 (-0700) 表示您必须应用以获取本地时间的小时偏移量。例如,整数 1318005467000 表示时间 '10/7/2011 4:37:47 PM'。当您应用 -0700 偏移量时,您将本地时间计算为“10/7/2011 9:37:47 AM”。有关详细信息,请参阅日期时间结构。

    所以现在是当地时间 11:48。 (不要问我“本地”的定义。)

    【讨论】:

    • 日期信息与我给的输入 dateTime 没有任何意义(悉尼时间 11:43 --> 第一班车是雷蒙德时间 11:48?)因此我假设我使用了不正确的输入时间。你知道我应该为输入时间指定什么吗? API 明确指出“11:43”将被解释为“本地”时间,因此这似乎是一个错误或不正确的文档。
    • 你给了 11:43 “本地”时间,它返回 11:48 “本地”时间。虽然 -0700 应该表示雷德蒙德,但文档中没有任何地方说它确实如此。
    • 返回悉尼时间 5:48,而不是 11:48。
    • 你是怎么得到 5:48 的?
    • 我得到了:“/Date(1427222880000-0700)/”所以我将 1427222880000 放入 epochconverter.com 并得到:“您的时区:2015 年 3 月 25 日,上午 5:48:00格林威治标准时间 + 11:00 DST”。我的时区是悉尼:我坐在悉尼,我的查询是往返悉尼。
    猜你喜欢
    • 2018-06-18
    • 2017-11-16
    • 1970-01-01
    • 2021-06-29
    • 2018-05-27
    • 2015-06-17
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    相关资源
    最近更新 更多