Получение времени в Swift 4

Я новичок в программировании и пытаюсь начать свое путешествие с изучения Swift. В настоящее время я работаю над погодным приложением, которое я разрабатываю для учебных целей.

Я использую API openweathermap.org для получения данных о погоде и солнечном свете.

Прямо сейчас я полностью могу анализировать JSON и использовать информацию. Единственная проблема, с которой я сталкиваюсь, заключается в том, что Swift вычисляет время заката и восхода солнца на основе моего местного часового пояса, чего я не хочу.

Я живу в Амстердаме. Если я хочу посмотреть закат и восход солнца в Нью-Йорке, я должен получить информацию о закате и восходе солнца на основе местного времени Нью-Йорка, а не моего.

func sunTimeConverter(unixTimeValue: Double) -> String {
    let dateAndTime = NSDate(timeIntervalSince1970: unixTimeValue)
    let dateFormater = DateFormatter()
    dateFormater.dateStyle = .none
    dateFormater.timeStyle = .short
    dateFormater.timeZone = TimeZone(abbreviation: "GMT")
    dateFormater.locale = Locale.autoupdatingCurrent
    let currentdateAndTime = dateFormater.string(from: dateAndTime as Date)
    return currentdateAndTime
}  

 let sunSetFromJSON = jsonObject["sys"]["sunset"].doubleValue
 weatherDataModel.citySunSet = sunTimeCoverter(unixTimeValue: sunSetFromJSON)

это объект JSON:

{
  "main" : {
    "humidity" : 93,
    "temp_max" : 285.14999999999998,
    "temp_min" : 284.14999999999998,
    "temp" : 284.39999999999998,
    "pressure" : 1020
  },
  "name" : "Beverwijk",
  "id" : 2758998,
  "coord" : {
    "lon" : 4.6600000000000001,
    "lat" : 52.479999999999997
  },
  "weather" : [
    {
      "id" : 701,
      "main" : "Mist",
      "icon" : "50n",
      "description" : "mist"
    }
  ],
  "clouds" : {
    "all" : 75
  },
  "dt" : 1510260900,
  "base" : "stations",
  "sys" : {
    "id" : 5204,
    "message" : 0.0201,
    "country" : "NL",
    "type" : 1,
    "sunset" : 1510242952,
    "sunrise" : 1510210438
  },
  "cod" : 200,
  "visibility" : 4500,
  "wind" : {
    "speed" : 3.6000000000000001,
    "deg" : 220
  }
}

person Joseph    schedule 09.11.2017    source источник
comment
Сначала создайте дату, используя unixTimeValue. Date(timeIntervalSince1970: unixTimeValue)   -  person Leo Dabus    schedule 10.11.2017
comment
Затем используйте средство форматирования даты, чтобы показать свое местное время.   -  person Leo Dabus    schedule 10.11.2017
comment
Единственный способ показать время заката/восхода солнца в городе в часовом поясе этого города — определить часовой пояс города. Получите часовой пояс из данных и используйте его.   -  person rmaddy    schedule 10.11.2017
comment
Вы используете TimeZone(abbreviation: "GMT"). Вам нужно TimeZone(abbreviation: "EST"), если вы ищете Нью-Йорк. Если вы хотите сделать его динамическим, вы должны получить эту информацию от устройства. Это по-прежнему обеспечивает детализацию до конкретных городов.   -  person Aaron    schedule 10.11.2017
comment
я специально не ищу часовой пояс Нью-Йорка. Идея приложения состоит в том, чтобы позволить пользователям искать города по всему миру.   -  person Joseph    schedule 10.11.2017
comment
В вашем сообщении отсутствует конкретный вопрос. Возможно, вы захотите отредактировать его, чтобы уточнить, о чем именно вы просите, чтобы избежать двусмысленности в комментариях и/или ответах сообщества.   -  person Aaron    schedule 10.11.2017
comment
@Джозеф, время UTC. Просто преобразуйте время unix в дату и используйте средство форматирования даты, чтобы показать время. Это все, что вам нужно   -  person Leo Dabus    schedule 10.11.2017
comment
@ Аарон Вопрос вполне ясен. Если я хочу посмотреть закат и восход солнца в Нью-Йорке, я должен получить информацию о закате и восходе солнца на основе местного времени Нью-Йорка, а не моего..   -  person rmaddy    schedule 10.11.2017
comment
Нет, это не так. Я не вижу там вопроса и не говорит например. Это заявление. Возникает четкий вопрос: как узнать время заката и восхода солнца для каждого города?   -  person Aaron    schedule 10.11.2017
comment
API вернет json на основе запроса. Время Unix - это все, что вам нужно, чтобы получить дату. Вам просто нужно использовать соответствующий часовой пояс города, который вы использовали для запроса данных.   -  person Leo Dabus    schedule 10.11.2017
comment
Вы также должны опубликовать код, касающийся вашего запроса API.   -  person Leo Dabus    schedule 10.11.2017


Ответы (2)


Вам нужно немного изменить свой метод и добавить часовой пояс, который вы хотите отобразить:

func sunTimeCoverter(unixTimeValue: Double, timezone: String) -> String {
  let dateAndTime = NSDate(timeIntervalSince1970: unixTimeValue)
  let dateFormater = DateFormatter()
  dateFormater.dateStyle = .none
  dateFormater.timeStyle = .short
  dateFormater.timeZone = TimeZone(abbreviation: timezone)
  dateFormater.locale = Locale.autoupdatingCurrent
  let currentdateAndTime = dateFormater.string(from: dateAndTime as Date)
  return currentdateAndTime
}

Итак, для Нью-Йорка вы бы назвали это так: (Вам нужно знать часовой пояс от openweathermap.org )

let sunSetFromJSON = jsonObject["sys"]["sunset"].doubleValue
weatherDataModel.citySunSet = sunTimeCoverter(unixTimeValue: sunSetFromJSON, timezone: "UTC-05:00")
person Robert D. Mogos    schedule 09.11.2017
comment
Часовой пояс должен исходить из данных, а не жестко запрограммирован. - person rmaddy; 10.11.2017
comment
Конечно, но я не знаю, что было внутри его jsonObject. Это был просто пример - person Robert D. Mogos; 10.11.2017
comment
Кажется, что люди жалуются на openweathermap.org, что часовой пояс не включен: openweathermap.desk.com/customer/portal/questions/ - person Robert D. Mogos; 10.11.2017
comment
я думаю, я должен понять это, используя данные широты и долготы из API! - person Joseph; 10.11.2017
comment
Вы вынуждены использовать openweathermap? Вы можете проверить darksky или weatherbit, который дает вам часовой пояс, чтобы было проще - person Robert D. Mogos; 10.11.2017
comment
спасибо, Роберт :D, на самом деле, как я упоминал во вступительном тексте, я начал программировать около 3 месяцев назад, например, по 16 часов в день, 6 дней в неделю. как я учусь, я не хочу быть ленивым с самого начала! поэтому я каждый день стараюсь изо всех сил, чтобы узнать все больше и больше сложных вещей, единственная причина, по которой я хочу придерживаться API openweathermap.org, заключается в том, что я хочу, чтобы мой код был чистым и точным! и я заметил, что узнаю все больше и больше, например, я только что опубликовал свою первую тему stackoverflow: D - person Joseph; 10.11.2017
comment
Попался. Ваш вопрос сложен, потому что вы спрашиваете, как преобразовать время unix в строку даты с определенным часовым поясом, а не с вашим собственным часовым поясом, на который я дал вам ответ. Но в вашем конкретном случае с openweathermap это невозможно, так как у вас нет доступа к часовому поясу. Поэтому я бы 1. изменил вопрос или 2. принял ответ и задал другой вопрос о том, как получить часовой пояс из широты/долготы или названия города. - person Robert D. Mogos; 10.11.2017
comment
Глядя на документы для API, 5-дневный прогноз включает как часовой пояс местоположения, так и данные о восходе и закате солнца. - person rmaddy; 10.11.2017
comment
Только ответ XML, а не JSON - person Robert D. Mogos; 10.11.2017
comment
Я решил это, используя оператор switch! API openweathermap.org предоставляет инициалы страны, поэтому я создал переключатель! func findOutTimeZone(countryInit: String) -> String { switch countryInit { case US: return GMT-07:30, я знаю, что это не реальное решение! но, по крайней мере, я могу обойти информацию, которую я получаю от openweather api, - person Joseph; 10.11.2017
comment
@Джозеф, забудь об этом подходе. В США несколько часовых поясов. Вы можете искать часовой пояс, используя город, а не только страну. - person Leo Dabus; 10.11.2017

Вы можете получить часовой пояс места на основе этот ответ. И на основе часового пояса вы можете рассчитать время заката и восхода солнца для этого места.

person vishalwaka    schedule 09.11.2017