【问题标题】:How to obtain Open Weather API date/time from city being fetched?如何从正在获取的城市获取 Open Weather API 日期/时间?
【发布时间】:2020-10-04 03:36:34
【问题描述】:

我正在使用 Open Weather API 创建一个简单的天气 React 应用程序。我还在为天气图标使用外部库。

用户输入城市名称并根据描述获取带有特定图标的当前温度。

我的问题是无法判断是白天还是黑夜,这取决于需要显示的图标。

我从数据中得知 Unix 时间戳正在为城市获取,但是当我转换它时,显示的是本地时间。还有一个时区偏移,但据我了解,无法在 JavaScript 中转换为城市名称。我检查了npm 包,但找不到。我希望能够获取正在搜索的特定城市的日期/时间,而不是我的当地时间。

我应该继续使用另一个 API 吗?以下是从伦敦提取的数据:

{coord: {…}, weather: Array(1), base: "stations", main: {…}, visibility: 10000, …}
base: "stations"
clouds: {all: 40}
cod: 200
coord: {lon: -0.13, lat: 51.51}
dt: 1592155233
id: 2643743
main: {temp: 71.8, feels_like: 66.69, temp_min: 71.01, temp_max: 73, pressure: 1014, …}
name: "London"
sys: {type: 1, id: 1414, country: "GB", sunrise: 1592106173, sunset: 1592165939}
timezone: 3600
visibility: 10000
weather: Array(1)
0: {id: 802, main: "Clouds", description: "scattered clouds", icon: "03d"}
length: 1
__proto__: Array(0)
wind: {speed: 9.17, deg: 170}

【问题讨论】:

  • sunrisesunset 是 UTC 值,Date.getTime() 也是如此,因此与日落/日出的比较应该很容易确定白天/黑夜
  • 我肯定是想多了。这是我一直在寻找的答案。您能否将其写在答案中,以便我标记完成?

标签: javascript reactjs npm fetch openweathermap


【解决方案1】:

我想出了如何从获取数据的特定城市获取正确的时间。 Open Weather 以秒为单位显示时区。例如,我将使用佐治亚州亚特兰大的时间偏移量 -14400。见下文:

d = new Date()
localTime = d.getTime()
localOffset = d.getTimezoneOffset() * 60000
utc = localTime + localOffset
var atlanta = utc + (1000 * -14400)
nd = new Date(atlanta)

// Mon Jun 15 2020 17:07:59 GMT-0700

基本上遵循以下步骤:

  1. 获取当前当地时间
  2. 查找本地时间偏移
  3. 获取当前 UTC 时间
  4. 以小时为单位获取目的地城市的偏移量并转换为毫秒
  5. 转换为可读格式

【讨论】:

    【解决方案2】:

    他们给了你一个时区:

    const obj = {
      dt: 1592155233,
      id: 2643743,
      main: {
        temp: 71.8,
        feels_like: 66.69,
        temp_min: 71.01,
        temp_max: 73,
        pressure: 1014,
      },
      name: "London",
      sys: {
        type: 1,
        id: 1414,
        country: "GB",
        sunrise: 1592106173,
        sunset: 1592165939
      },
      timezone: 3600
    }
    console.log(new Date(obj.dt*1000-(obj.timezone*1000))); // minus 
    console.log(new Date(obj.dt*1000+(obj.timezone*1000))); // plus

    【讨论】:

    • 我相信我刚刚做到了
    • 您需要添加时区值 - 而不是减去。
    【解决方案3】:

    我相信你可能想错了。

    必须查询你想要的时间范围的天气,否则它怎么知道你问的是哪个天气时段。

    因此,在您的查询中您必须提供您想要的天气和位置的时间段。现在,如果您忽略它,它总是默认为 当前期间 天气。

    例如你的电话应该是这样 -

    // modify it your needs with version, city, API etc
    http://history.openweathermap.org/data/2.5/history/city?[location]&type=hour&start={start}&cnt={cnt}&appid={YOUR_API_KEY}
    

    现在,当您收到回复时,您可以将其关联与您正在寻找的city date time

    【讨论】:

    • 这会很棒!!不幸的是,我的免费订阅不提供此功能。不想为创建一个简单的应用程序付费。不过谢谢!
    【解决方案4】:

    您可以通过API返回的数据中的timezone获取当前时间。 Open Weather API 文档将其描述如下:

    • timezone : 以秒为单位从 UTC 偏移

    【讨论】:

      【解决方案5】:

      如果您主要关心的是图标显示为白天还是晚上,而 API 已经有一组内置图标和数据来确定是白天还是晚上,用于查看哪个图标适合。这是此处的图标列表 OpenWeatherMap Weather Conditions。如果您转到 JSON 文件,您会在顶部看到 "icon": "04n" 之类的内容,位于 "weather" 数组中。 n(就像在这个特定的例子中)决定了在哪里显示一个晚上或一个白天图标。为了实际显示图标有点不同,基本上“应该做的事情”是这样的。在 HTML 中创建一个图像元素,然后使用 DOM 并根据 API 发送的内容更改其 src 属性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-17
        • 1970-01-01
        • 2013-05-09
        • 1970-01-01
        • 2018-07-25
        • 1970-01-01
        • 1970-01-01
        • 2021-06-20
        相关资源
        最近更新 更多