如何从正在获取的城市获取 Open Weather API date/time?

How to obtain Open Weather API date/time from city being fetched?

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

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

我的问题是无法判断现在是晚上还是白天,具体取决于需要显示的图标。

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

我应该换一个 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}

我相信你可能以错误的方式思考这个问题。

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

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

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

// 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}

现在当您收到回复时,您可以将它与您citydate time联系起来date time正在求!

他们给了你一个时区:

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

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

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

我想出了如何从获取数据的特定城市获取正确的时间。 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. 转换为可读格式

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