0

我在 SO 中进行了搜索,但找不到有用的线程来完成我想要的。我是 Swift 的新手,所以我对此知之甚少。所以场景是我想设置一个特定的时区,用户可以使用应用程序的设置更改该时区。我想要的是当用户更改所述时区时,它应该反映在整个应用程序中。是的,我可以在每个“DateFormatter”中设置时区,但我不想在每次创建 DateFormatter 时都编写它。

有没有办法让我创建 DateFormatter 的实例时,时区已经设置为用户选择的时区?是否可以使用 DateFormatter 的扩展来做到这一点?

4

1 回答 1

3

您可以做的是扩展Date您将其设置TimeZoneDateFormatter格式化您的日期,因此制作两个扩展,一个用于Date和一个用于String

extension Date {

    struct CustomDateFormatter {

        static var currentTimeZone = TimeZone.current //Set default timeZone that you want

        static func dateFormatter(withFormat format: String) -> DateFormatter {
            let formatter = DateFormatter()
            formatter.timeZone = CustomDateFormatter.currentTimeZone
            formatter.dateFormat = format
            return formatter
        }            
    }

    func toDateString(withFormat format: String) -> String {
        return CustomDateFormatter.dateFormatter(withFormat: format).string(from: self)
    }
}

extension String {
    func toDate(withFormat format: String) -> Date? {
        return Date.CustomDateFormatter.dateFormatter(withFormat: format).date(from:  self)
    }
}

现在,当您需要设置TimeZone或想要转换DateString或反之亦然时,请像这样使用此扩展程序。

//Set timezone
Date.CustomDateFormatter.currentTimeZone = TimeZone(abbreviation: "GMT")!
//get date from String
let date = "31-05-2017 07:30:05".toDate(withFormat: "dd-MM-yyyy HH:mm:ss")
//get string from date with specific format
let dateString = Date().toDateString(withFormat: "dd-MM-yyyy HH:mm:ss")
于 2017-05-31T05:40:27.170 回答