Получите данные о завтрашней погоде из прогноза JSON за 5 дней - PullRequest
0 голосов
/ 16 января 2019

Привет :) Я пишу бот-телеграмму, которая показывает сегодняшнюю и завтрашнюю погоду. В качестве данных я использую openweathermap.org.

На данный момент я создал метод getTodaysWeather, который получает информацию об объектах Java из JSON на http://www.jsonschema2pojo.org, и написал это:

public class Weather {

    public static final String URL_SOURCE = "http://api.openweathermap.org/data/2.5/weather?q=";
    public static final String API_KEY = "&APPID=3ad54740fd37f3f14a3a32a09f09cd25";
    public static final String UNITS = "&units=metric";
    public static final String LANG = "&lang=ru";

    public static String getWeather(String message) throws IOException{

        URL url = new URL(URL_SOURCE + message + LANG + UNITS + API_KEY);

        InputStreamReader reader = new InputStreamReader(url.openStream());

        Scanner in = new Scanner((InputStream) url.getContent());
        String result = "";

        while (in.hasNext()) {
            result += in.nextLine();
        }

        OneDayWeather obj = null;
        Gson gson = new Gson();
        String json = result;

        obj = gson.fromJson(json, OneDayWeather.class);

        System.out.println("City " + obj.getName() + "(" + obj.getSys().getCountry()+ ")" + "today's "+ System.lineSeparator() +
                "Temperature: " + obj.getMain().getTemp() + "°C, " + System.lineSeparator()+
                "Humidity: " + obj.getMain().getHumidity() + "%, " + System.lineSeparator()+
                "Rain: " + obj.getWeather().get(0).getDescription()+ System.lineSeparator()+
                "Wind speed: " + obj.getWind().getSpeed() + " m/s";
    }
}

Теперь мне нужно написать метод, который получит данные о погоде завтрашнего дня из этих данных JSON. http://api.openweathermap.org/data/2.5/forecast?q=London&APPID=21f2aefa331b0d3f72e50b14a06ff983 Если я не ошибаюсь, мне нужно найти блок в данных, дата которого близка к «завтра в 13:00», и получить информацию о температуре, влажности, ветре и т. Д. Каждый блок начинается с "" dt ": 1547672400". Я думаю, что это означает дату и время в другом формате. Если это так, мне нужно найти правильный блок и пропустить другой.

К сожалению, я не знаю, как реализовать этот метод. Если бы кто-то мог помочь мне, я был бы очень благодарен:)

1 Ответ

0 голосов
/ 16 января 2019

Что вы можете сделать, это преобразовать"завтра в 13:00" в UTC, а затем в метку времени Unix.Сохраните это значение как tomorrow13Unix.

Теперь для каждого прогноза в списке вы сравниваете его с tomorrow13Unix и, если оно совпадает, вы нашли то, что искали.

Обратите внимание , что API разбивает время на три части, поэтому вы можете вместо этого искать самое большое время, которое не больше, чем tomorrow13Unix.


Вот как я могу получить время эпохи завтрашнего дня в 13:00: * 10101 *

long tomorrow13Unix = java.time.OffsetDateTime.now(java.time.ZoneOffset.UTC).with(java.time.LocalTime.of(13, 0)).plusDays(1).toEpochSecond();

Примечание

Приведенное выше значение получит текущее время в UTC, затем усечет его до 13:00.добавить один день.Это может быть не то, что вы хотите.Вместо этого вы можете использовать свое местное время, добавить к нему один день, усечь до 13:00 и преобразовать полученное время в UTC, и в этом случае вы можете использовать это вместо:

long tomorrow13Unix = java.time.LocalDateTime.now().plusDays(1).with(java.time.LocalTime.of(13, 0)).toEpochSecond(java.time.ZoneOffset.UTC);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...