2017-04-17 24 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) 
相關問題