2017-04-17 36 views
1

我遇到了一些特殊情况,我不确定它为什么会发生或者如何处理它。DateFormatter的行为根据用户时间设置而有所不同

let formatter = DateFormatter() 
formatter.dateFormat = "h:mma" 
let timeString = "8:00am" 
let date = formatter.date(from: timeString)! 

如果用户将其时间设置为使用12小时制,则此代码有效。如果他们的设备设置为24小时制,则会崩溃。

如何使其独立于用户的设置而工作?

+1

类似:http://stackoverflow.com/questions/40692378/dateformatter-doesnt-return-date- for-hhmmss –

回答

4

你将不得不在现场更改为标准POSIX语言环境:

formatter.locale = Locale(identifier: "en_US_POSIX") 

technical note QA1480

在iOS上,用户可以覆盖默认的上午/下午与24小时时间设置(通过设置>常规>日期&时间> 24小时时间),这会导致NSDateFormatter重写您设置的格式字符串,这会导致您的时间解析失败。

请注意,这是一个不好的做法执行一个特定的时间格式,如果你不解析/编码数据。如果你想显示格式化的时间给用户,一个更好的解决方案是使用用户定义的格式:

let formatter = DateFormatter() 
formatter.dateStyle = .none 
formatter.timeStyle = .short 
+1

*“强制执行特定时间格式是一种不好的做法(如果您不解析/编码数据)。”* ...问题似乎是“我如何解析这些数据”,在这种情况下, ***的正确答案是使用'.locale'。 “更好的解决方案” - 在这种情况下 - 失败。 – DonMag

+0

@DonMag我实际上没有看到有关解析的任何内容,但我会稍微改变我的答案的语气。 – Sulthan

+0

是的,这是专门用于解析来自服务器的预定格式的数据,所以我很乐意使用这个解决方案。谢谢! – Erik

0

试试这个代码,你需要设置时区为你的约会,

let formatter = DateFormatter() 
formatter.dateFormat = "h:mma" 
formatter.timeZone = TimeZone.init(identifier: "UTC") 
let timeString = "8:00am" 
let date = formatter.date(from: timeString)! 

print(date) 
相关问题