在最近的开发任务中碰到一个问题,客户端需要传一个时间给服务器来标记时间,有格式要求:2024-04-09 13:59:24,要类似这样的,但是当用户将手机设置为12小时制后,获取到的时间就是这样的:2024-04-09 01:59:24 PM,服务端不认可这个格式的时间字符串,导致请求报错!
以下是我的代码:
func getCurrentTimeWithFormatter() -> String {
let currentTimeStamp = Date().timeIntervalSince1970
let dateFormater = DateFormatter()
dateFormater.dateFormat = "yyyy-MM-dd HH:mm:ss"
let formaterDate = dateFormater.string(from: Date(timeIntervalSince1970: currentTimeStamp))
return formaterDate
}
在查阅相关资料之后,发现在ios 15.4之后会出现这种情况,在之前的版本没有这个问题。 在15.4以后的版本中,我虽然设置了dateFormat 为"yyyy-MM-dd HH:mm:ss",手机设置的时间格式是12小时制,我获取到的时间就是带AM,PM格式的。
苹果官网对该问题有相关的回答:https://developer.apple.com/library/archive/qa/qa1480/_index.html
解释到通过NSDateFormatter获取的时间受设备控制,但是可以通过设置DateFormatter的local属性来规定你当前所处的时间区域,设置完成之后在12小时制的手机上获取到的时间格式还是带了AM,PM 继续查资料,找到这个大佬 https://www.jianshu.com/p/79465eb4e4c4 的解释才发现还需要设置日历格式才能正确获取到需要的时间格式。
dateFormater.locale = Locale.init(identifier: "zh_Hans_CN")
dateFormater.calendar = Calendar.init(identifier: .gregorian)
自此已经解决了日期格式问题,但是多说一句,在苹果官方那篇文章下面,还有一句话
说的是还可以把locale设置为autoupdatingCurrent也能解决问题,我手机的时区是北京,仍然是12小时制,我之后发现获取到的时间格式仍然是带有:AM,PM的:2024-04-09 2:45:53 PM。
所以需要注意下。