如何使用 Swift 从 JSON 字符串中获取时间?

How to get time from JSON string using Swift?

我从头开始尝试并浏览了。可能这个问题已经被问过很多次了。我根据 timezone 解析了城市(例如:Mar del Plata)的天气响应。我想要 HH:mm 格式的时间。以下是示例 JSON 响应。

"sunrise": "2016-07-10T08:05:02-0300", "sunset": "2016-07-10T17:46:29-0300"

我的代码:

let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZ"
dateFormatter.timeZone = NSTimeZone(forSecondsFromGMT: 0)
guard let date = dateFormatter.dateFromString(dateString) else {
    assert(false, "no date from string")
}
dateFormatter.dateFormat = "HH:mm"
//dateFormatter.timeZone = NSTimeZone(name: "UTC")
return dateFormatter.stringFromDate(date)

每当我在标签中打印或显示日期字符串时,时间就会发生变化。我想要准确的响应时间。

以上我的临时解决办法是

// Begin - Its a temperory solution
        if dateString.contains("T") {
            print("dateString.contains(T)")
            let myArray = dateString.componentsSeparatedByString("T")
            if myArray.count > 0 {
                let str = myArray[1]
                if str.contains("+") {
                    print("(str.contains(+))")
                    let myArr = str.componentsSeparatedByString("+")
                    if myArr.count > 0 {
                        let str1 = myArr[0]
                        if str1.contains(":") {
                            print("str1.contains(:)")
                            let myAr = str1.componentsSeparatedByString(":")
                            if myAr.count > 0 {
                                let str2 = myAr[0]

                                let str3 = myAr[1]

                                let str4 = "\(str2):\(str3)"
                                print(str4)
                                return str4
                            }
                            //print(myAr)
                        }

                    }

                }
                if str.contains("-") {
                    print("(str.contains(-))")
                    let myArr = str.componentsSeparatedByString("-")
                    if myArr.count > 0 {
                        let str1 = myArr[0]
                        if str1.contains(":") {
                            print("str1.contains(:)")
                            let myAr = str1.componentsSeparatedByString(":")
                            if myAr.count > 0 {
                                let str2 = myAr[0]

                                let str3 = myAr[1]

                                let str4 = "\(str2):\(str3)"
                                print(str4)
                                return str4
                            }
                            //print(myAr)
                        }

                    }

                }
            }

        }
        // End - Its a temporary solution

我想要一个更好的解决方案而不是我的临时解决方案。

编辑 1: 正如我提到的,我希望通过丢弃时区来同时进入 JSON 响应。

请建议我并指导我将来如何处理时区。希望你们明白,我在做什么。抱歉我的英语不好。

提前致谢。

试试下面的代码行。希望对你有所帮助...

let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZ"
dateFormatter.timeZone = NSTimeZone.systemTimeZone()
guard let date = dateFormatter.dateFromString(dateString)
else {
 assert(false, "no date from string")
}
dateFormatter.dateFormat = "HH:mm"
return dateFormatter.stringFromDate(date)

如果您绝对不关心时区,您可以简单地trim关闭它:

let sunrise = "2016-07-10T08:05:02-0300"
let sunriseNoTimezone = sunrise.substringToIndex(sunrise.endIndex.advancedBy(-5))

let formatter = NSDateFormatter()
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
formatter.timeZone = NSTimeZone(forSecondsFromGMT: 0)

let date = formatter.dateFromString(sunriseNoTimezone)

print(date)