为 DateFormatter 设置全局时区

Posted

技术标签:

【中文标题】为 DateFormatter 设置全局时区【英文标题】:Set global TimeZone for DateFormatter 【发布时间】:2017-05-31 02:59:57 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

您可以做的是扩展Date,因为您正在将此TimeZone 设置为DateFormatter 以形成您的日期,因此请为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 或想要将 Date 转换为 String 或反之亦然时,请像这样使用此扩展。

//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")

【讨论】:

@SquareBox 欢迎朋友 :)

以上是关于为 DateFormatter 设置全局时区的主要内容,如果未能解决你的问题,请参考以下文章

为啥不同时区对时间的解释不同?

当我在英国地区将字符串转换为日期并且时区是马斯喀特时,DateFormatter 给了我不正确的结果

使 DateFormatter() 静态

使用 DateFormatter 解析深奥的日期字符串

将UTC日期格式转换为本地nsdate

swift DateFormatter