如何在Swift中使用Pod TimeZoneLocate获得夏令时

时间:2019-04-19 16:12:02

标签: swift timezone dst

我正在将本地时区转换为字符串以在屏幕上显示它。为此,我使用TimeZoneLocate库。问题:由于未实施夏令时,所以我得到的日期结果比原先少一小时。

我从Sunrise-sunset.org获取JSON,并使用以下代码行:Sunrise =“ 3:22:31 AM”;日落=“下午5:23:25”。

我考虑过将函数isDaylightSavingTime()if语句一起使用,但是我不知道这一个小时在哪里添加。

这是发生魔术的功能:

func UTCToLocal(incomingFormat: String, outgoingFormat: String, location: CLLocation?) -> String {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = incomingFormat
    dateFormatter.timeZone = TimeZone(abbreviation: "UTC")

    let dt = dateFormatter.date(from: self)
    let timeZone = location?.timeZone ?? TimeZone.current

    dateFormatter.timeZone = timeZone
    dateFormatter.dateFormat = outgoingFormat

    return dateFormatter.string(from: dt ?? Date())
}

我使用CLLocation TimeZone中的本地“位置”。current由TimeZoneLocate库提供。

这就是我在代码中使用它的方式:

func parce(json: Data, location: CLLocation) {
    let decoder = JSONDecoder() 
if let sunriseData = try? decoder.decode(Results.self, from: json) {

self.sunriseLbl.text = sunriseData.results?.sunrise.UTCToLocal(incomingFormat: "h:mm:ss a",
outgoingFormat: "HH:mm",
location: location)

sunriseLbl默认情况下从JSON打印JSON日出数据到当前位置以及GooglePlaces的任何地方。但是,在这两种方式中,我的日期都不正确。

此外,如果可以帮助您,以下是我在GitHub上的项目的链接:https://github.com/ArtemBurdak/Sunrise-Sunset

预先感谢

1 个答案:

答案 0 :(得分:-1)

我注意到的一件有趣的事情:TimeZone.current 正在返回正确的时区,但是location?.timeZone 没有返回。如果有一种实现TimeZone.current的方法,即应用程序将始终使用用户的当前位置,那么我建议您使用它。但是,如果用户可以输入自定义位置,则需要解决location?.timeZone返回的明显不正确的时区的解决方法。

我的解决方法如下。请注意,我们通过更改.secondsFromGMT()属性来手动调整所需时区的位置。这就是我调整代码的方式,它为我的个人位置返回了正确的时区。

extension String {
    func UTCToLocal(incomingFormat: String, outgoingFormat: String, location: CLLocation?) -> String {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = incomingFormat
        dateFormatter.timeZone = TimeZone(abbreviation: "UTC")

        let dt = dateFormatter.date(from: self)

        var timeZone = location?.timeZone ?? TimeZone.current

        if timeZone.isDaylightSavingTime() {
            timeZone = TimeZone(secondsFromGMT: timeZone.secondsFromGMT() - 7200)!
        }
        dateFormatter.timeZone = timeZone
        dateFormatter.dateFormat = outgoingFormat

        let output = dateFormatter.string(from: dt ?? Date())

        return output
    }
}

注意: 时区非常复杂,并且会随着一年中当前时间的不同而变化。仅仅因为该解决方法适用于当天的当前位置,并不意味着该解决方法始终有效。 但是,您可以根据需要查看返回的timeZone.isDaylightSavingTime()值以及当前位置,以通过timeZone = TimeZone(secondsFromGMT: timeZone.secondsFromGMT() - x创建新的时区。这是实现

的方法
  

“我考虑过将带is语句的函数isDaylightSavingTime()使用,但我无法弄清楚这一个小时的添加位置。”

您拥有的想法。

编辑: 作为记录,我使用的时区是CST或芝加哥时间。我写此代码的日期是2019年4月19日。