В 5-дневном массиве погоды, как можно выделить один временной интервал в день, используя swift? - PullRequest
0 голосов
/ 30 апреля 2018

Я пытаюсь получить только высокую температуру, значок дня и т. Д. Для пика дня, который будет полдень. Я думаю, что это делается через DateFormatter, вот что у меня есть, и он возвращает 5-дневный прогноз без проблем, но он обновляется каждые 3 часа. Можно ли как-то отключить это и / или просто позвонить на 12:00 с использованием этого кода?

func getDayOfWeek(today:String)->String? {
    let formatter  = DateFormatter()
    formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
    let todayDate = formatter.date(from: today)
    formatter.dateFormat = "EEEE" // "eeee" -> Friday
    let weekDay = formatter.string(from: todayDate!)

    return weekDay
}

Все данные о погоде:

{
    "cod": "200",
    "message": 0.0054,
    "cnt": 40,
    "list": [{
                "dt": 1525100400,
                "main": {
                    "temp": 12.43,
                    "temp_min": 10.44,
                    "temp_max": 12.43,
                    "pressure": 1015.9,
                    "sea_level": 1035.33,
                    "grnd_level": 1015.9,
                    "humidity": 64,
                    "temp_kf": 1.99
                },
                "weather": [{
                    "id": 800,
                    "main": "Clear",
                    "description": "clear sky",
                    "icon": "01d"
                }],
                "clouds": {
                    "all": 0
                },
                "wind": {
                    "speed": 4.66,
                    "deg": 307.008
                },
                "sys": {
                    "pod": "d"
                },
                "dt_txt": "2018-04-30 15:00:00"
            }

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Это очень простой пример в качестве отправной точки, показывающий только соответствующие данные.

Пример декодирует массив list в пользовательскую структуру. клавиша dt декодируется в Date. Затем он создает экземпляр DateComponents с полуднем в текущем часовом поясе и фильтрует даты.

struct WeatherData : Decodable {
    let cod : String
    let list : [List]
}

struct List : Decodable {
    let dt : Date
}

let jsonString = """
{ "cod": "200", "message": 0.0054, "cnt": 40, "list": [{ "dt": 1525100400, "main": {"temp": 12.43, "temp_min": 10.44, "temp_max": 12.43, "pressure": 1015.9, "sea_level": 1035.33, grnd_level": 1015.9, "humidity": 64, "temp_kf": 1.99 }, "weather": [{"id": 800, "main": "Clear", "description": "clear sky", "icon": "01d"}],    "clouds": {"all": 0}, "wind": {"speed": 4.66, "deg": 307.008},"sys": {"pod": "d"},"dt_txt": "2018-04-30 15:00:00"}]}
"""

let data = Data(jsonString.utf8)
do {
    let decoder = JSONDecoder()
    decoder.dateDecodingStrategy = .secondsSince1970
    let result = try decoder.decode(WeatherData.self, from: data)
    let utcDifference = TimeZone.current.secondsFromGMT() / 3600
    let noonComponents = DateComponents(hour: 12 + utcDifference, minute: 0, second: 0)
    let noonDates = result.list.filter { Calendar.current.date($0.dt, matchesComponents:noonComponents) }
    print(noonDates)

} catch {
    print("error:", error)
}
0 голосов
/ 30 апреля 2018

Расшифруйте поле dt и / или поле dt_txt как строковые значения и выполните простое сравнение строк, чтобы увидеть, является ли это прогнозом на полдень.

dt.starts(with: "12")
//or
dt_txt.contains("12:00:00")
...