在Swift中转换UTC时间

时间:2018-11-25 19:42:37

标签: ios swift

我正在尝试在实践项目中使用API​​,并且JSON中的值之一dateTimeLocal是采用UTC格式的日期和时间。

在我的cellForRowAt方法中,我将日期/时间放入标签中:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "eventsCell", for: indexPath) as! EventsTableViewCell

    let event = eventData[indexPath.row]

    cell.eventTimeLabel.text = event.dateTimeLocal

    return cell
}

这将日期和时间打印为:

2018-11-26T19:00:00

我想以上面的日期/时间为例,以读取的格式获取此日期和时间,

November 26, 2018 @ 7:00pm

这是否可能,或者我是否必须以给定的UTC格式包括日期和时间?


以下是适用于此问题的其余代码:

用于解码JSON的结构:

struct Welcome: Decodable {
    let events: [Event]
}

struct Event: Decodable {
    let title: String
    let dateTimeLocal: String
    let venue: Venue

    enum CodingKeys: String, CodingKey {
        case title
        case dateTimeLocal = "datetime_local"
        case venue
    }
}

此函数可获取数据:

func fetchData<T: Decodable>(url: URL, completion: @escaping (FetchResult<T>) -> (Void)) {

    URLSession.shared.dataTask(with: url) { (data, response, error) in

        guard let data = data else {completion(.failure(error!)); return}

        do {
            let object = try JSONDecoder().decode(T.self, from: data)
            completion(.success(object))
        } catch {
            completion(.failure(error))
        }
    }.resume()
}

在我的viewDidLoad中叫哪个名字:

    fetchData(url: seatGeekApiUrl) { (result: FetchResult<Welcome>) -> (Void) in

        switch result {
        case .success(let object): self.eventData = object.events
            print("\neventData: \n\n\(self.eventData)")
        case .failure(let error):
            print("\nError decoding JSON: \n\n\(error)")
        }
        DispatchQueue.main.async {
            self.tableView.reloadData()
        }
    }

1 个答案:

答案 0 :(得分:1)

首先将dateTimeLocal解码为Date

let dateTimeLocal: Date

并添加适当的日期解码策略以解码(不完全兼容)ISO 8601字符串

let decoder = JSONDecoder()
let formatter = DateFormatter()
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
decoder.dateDecodingStrategy = .formatted(formatter)
let object = try decoder.decode(T.self, from: data)

在视图控制器类中,在顶层添加静态日期格式器

let dateFormatter : DateFormatter = {
   let formatter = DateFormatter()
   formatter.locale = Locale(identifier: "en_US_POSIX")
   formatter.dateFormat = "MMMM dd, yyyy '@' h:mma"
   return formatter
}()

并在cellForRow中指定格式化日期

cell.eventTimeLabel.text = dateFormatter.string(from: event.dateTimeLocal)