ios - TimeZone:获取缩写而不是 GMT 偏移量
问题描述
我需要得到时区的缩写。
例如,俄罗斯莫斯科有缩写MSK
。中欧时间有CET
, 东欧夏令时间有EEST
, 等等。
当我打开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 设置中相同的字符串。
解决方案
我玩过代码片段。希望能帮助您解决问题。
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\")"
推荐阅读
- sonarqube - 如何在项目级别使用 UI 排除代码覆盖率?
- bluetooth - 如何在 Mac App 处于非活动状态时捕获蓝牙控制器?
- java - 我应该担心我的网站性能,因为 tomcat 9 没有使用阻塞 io
- python - 在 python 中显示列表中的素数。说不支持的操作数时出错
- angular - 是否可以在 Angular Material Tooltip 中有一个列表?
- jsp - jsp:include - 处理 JSP 页面时发生异常
- javascript - 错误无法使用带有 mysql 的 node.js 读取未定义的属性
- php - Laravel 嵌套子级计数(类别)
- intersection - 如何解决播放器与矩形相交的这个小问题?
- html - Bootstrap Modal 似乎不适用于 Anchor Tag