DateFormatter“HH”没有以24小时格式快速给出时间

Dip*_*hah 2 iphone datetime nsdateformatter ios swift

我正在尝试使用 UTC 时区以 24 小时格式获取 currentTime。当我在不同的设备上调试我的应用程序时,我遇到了一个奇怪的问题。

该代码在我的设备上运行良好,但它在我表弟的装有 iOS 11.2 的 iPhone 中以 12 小时格式给出时间。因此,我尝试在具有相同操作系统的 iPhone X 设备上运行应用程序。

我不确定出了什么问题,但后来我也在其他一些设备上尝试了这个,并且该应用程序在所有其他设备上运行良好。PS 我的应用程序的旧版本也可以在堂兄的手机上使用相同的代码运行良好。

这是我用来获取 currentTime 的代码。

        let dateFormatter = DateFormatter()
        dateFormatter.timeZone = NSTimeZone(abbreviation: "UTC") as TimeZone!
        dateFormatter.dateFormat = "EEEE"
        dayOfWeekString = dateFormatter.string(from: NSDate() as Date)

        dateFormatter.dateFormat = "HH"
        let CurrentTime = dateFormatter.string(from: NSDate() as Date)
        let CHour = Int(CurrentTime)!
Run Code Online (Sandbox Code Playgroud)

寻找解决方案

vad*_*ian 6

DateFormatter 还考虑当前的语言环境。

建议将 locale 设置为固定值

let dateFormatter = DateFormatter()
dateFormatter.timeZone = TimeZone(abbreviation: "UTC")!
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
dateFormatter.dateFormat = "HH"
let currentTime = dateFormatter.string(from: Date())
Run Code Online (Sandbox Code Playgroud)

但是,有一种更可靠的方法使用Calendar. 该hour日期组件采用24小时制反正你不需要转换Int

var calendar = Calendar(identifier: .gregorian)
calendar.timeZone = TimeZone(abbreviation: "UTC")!
let currentHour = calendar.component(.hour, from: Date())
Run Code Online (Sandbox Code Playgroud)

注:请不要使用NSDateNSLocaleNSTimeZone等在斯威夫特。使用本机结构。