Как получить дату / время Open Weather API из извлекаемого города?

Я создаю простое приложение Weather React с помощью Open Weather API. Я также использую внешнюю библиотеку для значков погоды.

Пользователь вводит название города и получает текущую температуру со специальным значком в зависимости от описания.

Моя проблема в том, что нет способа определить, день сейчас или ночь, что было бы характерно для значка, который необходимо отображать.

Я понимаю, что метка времени 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}

person ByteTheBits    schedule 14.06.2020    source источник
comment
sunrise и sunset - значения UTC и Date.getTime(), поэтому сравнение с закатом / восходом солнца должно быть легко определить день / ночь.   -  person charlietfl    schedule 14.06.2020
comment
Я определенно слишком много думал об этом. Это тот ответ, который я искал. Не могли бы вы написать это в ответе, чтобы я мог отметить как выполненный?   -  person ByteTheBits    schedule 14.06.2020


Ответы (5)


Они дали вам часовой пояс:

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

person mplungjan    schedule 14.06.2020
comment
Я верю, что только что сделал - person mplungjan; 15.06.2020
comment
Вам нужно добавить значение часового пояса, а не вычитать. - person Robert Wildling; 08.10.2020

Я выяснил, как получить точное время в конкретном городе, из которого берутся данные. В 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. конвертировать в читаемый формат
person ByteTheBits    schedule 15.06.2020

Я верю, что вы, возможно, неправильно думаете об этом.

Вы должны запрашивать погоду в те временные рамки, которые вам нужны, иначе как узнать, какой период погоды вы запрашиваете.

Итак, в вашем запросе вы должны указать период, для которого вы хотите погоду и какое место. Теперь, если вы не укажете этот параметр, по умолчанию всегда будет использоваться погода текущего периода.

Например, ваш звонок должен быть таким -

// 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, которые вы ищете!

person Transformer    schedule 14.06.2020
comment
Это было бы здорово !! К сожалению, моя бесплатная подписка не предусматривает этого. Не хотите платить за создание простого приложения. Спасибо хоть! - person ByteTheBits; 14.06.2020

Вы можете получить текущее время, используя timezone в данных, возвращаемых API. В документации Open Weather API это описывается следующим образом:

  • timezone: Сдвиг в секундах от UTC
person Philippe Talarico    schedule 14.06.2020

Если вас больше всего беспокоит то, какие значки отображаются в дневное или ночное время, когда API уже имеет встроенный набор значков и данных для определения, где бы ни было дневное или ночное время, которые используются для определения подходящего значка. Вот список значков отсюда OpenWeatherMap Погодные условия. Если вы перейдете к файлу JSON, вы увидите вверху что-то вроде "icon": "04n" в массиве "weather". Этот n (как в этом конкретном примере) определяет, где отображать значок дня или ночи. Чтобы отобразить значок на самом деле, это немного другая история, в основном то, что «должно быть сделано», - это что-то вроде. Создание элемента изображения в HTML, а затем использование DOM и изменение его атрибута src в зависимости от того, что отправляет API.

person Dan    schedule 25.04.2021