TimeZone: получить аббревиатуру вместо смещения по Гринвичу

Мне нужно получить аббревиатуру часового пояса.

Например, Москва в России имеет аббревиатуру 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 всегда указывало аббревиатуру вместо смещения по Гринвичу? Есть ли другой способ всегда получать аббревиатуру, независимо от локали или других системных настроек?

Моя цель — получить ту же строку, что и в настройках macOS.


person Richard Topchii    schedule 14.08.2019    source источник


Ответы (1)


Я играл с фрагментом кода. Надеюсь, это поможет вам решить вашу проблему.

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\")"
person Cuong Nguyen    schedule 14.08.2019