应用 OpenWeatherMap 提供的时区偏移数据 (Swift)

Applying timezone offset data provided by OpenWeatherMap (Swift)

只要您有 UTC 数据,使用这样的函数就可以非常简单地获取用户当前位置的当前日期、小时、分钟等:

func getHourForDate(_ date: Date?)-> String{
    guard let date = date else {return "error"}
    
    //initialize formatter
    let formatter = DateFormatter()
    //set format to 12 hour clock with am/pm
    formatter.dateFormat = "h a"
    
    //return formatting string
    return formatter.string(from: date)
}

我 运行 遇到的问题是,当我尝试解析来自世界各地的数据时,该函数只根据我自己的位置给我时间。 OpenWeather 似乎提供了一些数据来解决这个问题。查看我创建的天气响应中的几个参数:

struct WeatherResponse: Codable {
   let timezone: String
   let timezone_offset: Int
}

所以我有一个字符串,它为我提供了诸如“Atlantic”之类的数据和诸如“-14400”之类的偏移量。问题是我不知道如何应用这些数据。简单地从 API 提供的 UTC 时间中减去 timezone_offset 似乎是不正确的。我尝试了类似下面提供的代码,但它似乎只在我 运行 我的 phone 上的应用程序时有效,使用我的当前实际位置,而不是当我尝试模拟世界各地的其他位置时我当前位置:

//get the difference of my current location timezone offset and the offset of each json response 
//(this should cancel out any offset for my current location)
let timezoneDifference = currentLocationTimezoneOffset - timezone_offset
//subtract the offset from the hour date provided by the json
let offset = utcFromJson - timezoneDifference

//pass the offset into the function to return a formatted date string
let hourLabel.text = getHourForDate(Date(timeIntervalSince1970: TimeInterval(offset)

我希望这个问题是直截了当的,或者我没有遗漏任何有用的信息。感谢任何帮助,谢谢!

您可以尝试一些简单的操作,例如此示例代码,以获取“其他”位置的时间:

let timeHere = Date()

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "LLLL dd, hh:mm:ss a"
dateFormatter.timeZone = TimeZone(secondsFromGMT: response.timezone_offset) // <-- here

let timeThere = dateFormatter.string(from: timeHere)

print("timeHere: \(timeHere)   timeThere: \(timeThere) \n")