首页 > 解决方案 > TimeZone:获取缩写而不是 GMT 偏移量

问题描述

我需要得到时区的缩写。

例如,俄罗斯莫斯科有缩写MSK。中欧时间有CET, 东欧夏令时间有EEST, 等等。

当我打开macOS设置时,我可以清楚地看到缩写:

macos 设置截图

但是,当我尝试在代码中获取缩写时,我只得到GMT偏移量:

import UIKit
let date = Date()
let zone = TimeZone(abbreviation: "EEST")
print(zone?.abbreviation(for: Date()))

可选(“GMT+3”)

另一方面,当我尝试使用美国时间时,我得到了正确的缩写:

import UIKit
let date = Date()
let zone = TimeZone(abbreviation: "EDT")
print(zone?.abbreviation(for: Date()))

可选(“EDT”)

我怎样才能始终强制TimeZone给出缩写而不是 GMT 偏移量?无论语言环境或其他系统设置如何,是否有任何其他方法可以始终获取缩写?

我的目标是获得与 macOS 设置中相同的字符串。

标签: iosdatetimezonensdatenstimezone

解决方案


我玩过代码片段。希望能帮助您解决问题。

import Foundation
import UIKit
import CoreLocation

public struct LocalTime {
    var timeZone: TimeZone?
    var dateTime: String
    init(timeZone: TimeZone, dateTime: String) {
        self.timeZone = timeZone
        self.dateTime = dateTime
    }
}

class ViewController: UIViewController {
    var timeZone: TimeZone?
    var localTime: LocalTime?
    override func viewDidLoad() {
        super.viewDidLoad()

    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.getLocalTimeZone(lat: 47.6062, lon: -122.3321, dateTime: "2017-06-10T00:30:00Z")
    }

    override func viewDidAppear(_ animated: Bool) {

    }

    func convertToLocalDateFromUTCDate(dateStr: String) -> String {
        let utcDateFormatter = DateFormatter()
        utcDateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
        let sourceDate = utcDateFormatter.date(from: dateStr)
        let localDateFormatter = DateFormatter()
        localDateFormatter.timeZone = self.timeZone
        localDateFormatter.dateFormat = "dd-MM-yyyy HH:mm:'00'"
        guard let date = sourceDate else { return "" }
        let localTime = localDateFormatter.string(from: date)
        return localTime
    }

    func getLocalTimeZone(lat: Double, lon: Double, dateTime: String) {
        let location = CLLocation(latitude: lat, longitude: lon)
        let geoCoder = CLGeocoder()
        var dateTimeString: String?
        geoCoder.reverseGeocodeLocation(location) { [weak self] (placemarks, err) in
            if let placemark = placemarks?[0] {
                guard let self = self else { return }
                dateTimeString = self.convertToLocalDateFromUTCDate(dateStr: dateTime)
                guard let timeZone = placemark.timeZone, let dateTimeString = dateTimeString else { return }
                self.localTime = LocalTime(timeZone: timeZone, dateTime: dateTimeString)
                debugPrint("\(self.localTime?.timeZone?.abbreviation())")
                debugPrint("\(self.localTime?.dateTime)")
            }
        }
    }

}

输出:

"Optional(\"PDT\")"
"Optional(\"10-06-2017 07:30:00\")"

推荐阅读