如何本地化 swift 中的时间?

How to localize the hours in swift?

这是API响应

{
  "session_start_time": "09:05:00",
  "session_end_time": "15:18:00"
}

这些时间基于 UTC +0 时区,我需要将它们转换为用户时区并显示给用户。

我该怎么做?

首先为您的响应创建一个结构,例如:

struct SessionData: Codable {
    
    let sessionStartTime: String
    let sessionEndTime: String
    
    enum CodingKeys: String, CodingKey {
        case sessionStartTime = "session_start_time"
        case sessionEndTime = "session_end_time"
    }
    
}

然后将您的 json 解码为 SessionData 并使用以下行:

let dateGetter = NSDateFormatter()
dateGetter.dateFormat = "HH-mm-ss"

let datePrinter = NSDateFormatter()
datePrinter.timeZone = NSTimeZone(abbreviation: "GMT") //GMT stands for prefered time zone
datePrinter.dateFormat = "HH"

let date: NSDate? = dateGetter.dateFromString(yourSessionData.sessionStartTime)
print(datePrinter.stringFromDate(date!))

经过几天的搜索,我找到了这个答案

然后用这个函数找到写入解决方案:

private func utcToLocal(dateStr: String) -> String? {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "HH:mm:ss"
    dateFormatter.timeZone = TimeZone(abbreviation: "UTC")
    
    if let date = dateFormatter.date(from: dateStr) {
        dateFormatter.timeZone = TimeZone.autoupdatingCurrent
        dateFormatter.dateFormat = "HH:mm"
        
        let tz = TimeZone.current
        if tz.isDaylightSavingTime(for: Date()) {
            // Summertime
            let calendar = Calendar.current
            if let summerDate = calendar.date(byAdding: .hour, value: 1, to: date) {
                return dateFormatter.string(from: summerDate)
            }else {
                return dateFormatter.string(from: date)
            }
        }else {
            return dateFormatter.string(from: date)
        }
    }
    return nil
}