Swift - DateFormat HH:mm的坑

閱讀時間約 3 分鐘

一般來說在swift把Date轉成String,會使用dateFormat轉換

extension Date {
func string(withFormat format: String = "dd/MM/yyyy HH:mm") -> String {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = format
return dateFormatter.string(from: self)
}
}

大寫的HH:mm是24小時制,小寫的hh:mm是12小時制

let date = Date()
print(date.string(withFormat: "yyyy/MM/dd HH:mm")) // 2023/08/24 16:21
print(date.string(withFormat: "yyyy/MM/dd hh:mm")) // 2023/08/24 04:21

但用HH:mm,碰到一個使用者回報,他的時間顯示是

2023/08/24 下午 04:21(哪來的下午啊?????

用了很多方法,用該使用者的iOS版本測、調手機時間調時區、調地區、調12小時、24小時制都無法重現情境,找了很久總算找到這篇 https://www.jianshu.com/p/79465eb4e4c4

要固定輸出的格式,Locale需指定en_US_POSIX

extension Date {
func toString(withFormat format: String = "dd/MM/yyyy HH:mm") -> String {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = format
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
dateFormatter.calendar = Calendar(identifier: .gregorian)
return dateFormatter.string(from: self)
}
}

官方解釋

if you’re working with fixed-format dates, you should first set the locale of the date formatter to something appropriate for your fixed format. In most cases the best locale to choose is “en_US_POSIX”, a locale that’s specifically designed to yield US English results regardless of both user and system preferences.

https://developer.apple.com/library/archive/qa/qa1480/_index.html

另外跟版本應該無關,因為這篇是iOS15.4,但我們的使用者是16.5.1,目前不知道規律但貌似中國的iphone比較有機會碰到

大蘋果:沒有遵守開發規範是你自己活該(指

avatar-img
7會員
35內容數
紀錄iOS開發上遇到的問題或是一些流程筆記。主要都是Swift。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
你可能也想看
Google News 追蹤
Thumbnail
一天24小時,每個人的時間都一樣,但不管時針分針怎麼指,真正的時間會變短、變長、變快與變慢,和格林威治的不同。只要在適合與屬於自己的時區內,不論快慢都是對的時間。此外,這個月最大的改變是意象練習的know how,意象練習的運用領域廣泛,尤其在需要高度專注與瞬間判斷的決策環境。
Thumbnail
關於『換年』的時間目前還是眾說紛紜,每個流派都有不同的換年計算時間,這是我目前學派的換年時間點,大家來參考看看。
Thumbnail
此章節旨在解釋Swift語言中函數的基本結構和操作方式,包括函數的聲明、呼叫、參數和返回值。閱讀這個章節可以幫助你理解並掌握如何在Swift編程中有效地使用和管理函數。
Thumbnail
本篇介紹了Swift程式語言中的各種流程控制元素,包括條件語句(如if, else if, else),三元運算子,多條件分支判斷的switch語句,以及各種迴圈(如for迴圈,while迴圈,以及repeat-while迴圈)。同時也詳細解釋了如何進行迴圈嵌套,以及如何使用控制迴圈語句。
Thumbnail
此章節旨在介紹Swift程式語言中的基本資料型別,包括整數、浮點數、布林型別、字串、字符、選擇型、型別轉換、自訂型別(包括類、結構和枚舉)、元組型別、集合型別、陣列型別和字典型別。每種型別的說明都包含了程式碼範例,以便讀者更好地理解其應用和使用方式。
Thumbnail
某種程度來說,也算是相當有時間觀念(?)。
夏令時,讓我平白少了一小時。 每年三月最後一週的週六、週日夜間,歐洲時區調整至夏令時,亦即時間撥快一小時。 手機電子鐘這種連線到電腦系統的,會自動調整,可是傳統的壁上時鐘,或是鬧鐘,就得自己手動調整。 不少人和我一樣,總會忘記時間被撥快一小時,以致於當天會有一種迷幻的感覺。
Thumbnail
在網頁開發中,時間與日期的處理是重要且基礎的部分,本文將介紹 JavaScript 中的日期的處理方法,並提供範例程式來協助你理解。
Thumbnail
一天24小時,每個人的時間都一樣,但不管時針分針怎麼指,真正的時間會變短、變長、變快與變慢,和格林威治的不同。只要在適合與屬於自己的時區內,不論快慢都是對的時間。此外,這個月最大的改變是意象練習的know how,意象練習的運用領域廣泛,尤其在需要高度專注與瞬間判斷的決策環境。
Thumbnail
關於『換年』的時間目前還是眾說紛紜,每個流派都有不同的換年計算時間,這是我目前學派的換年時間點,大家來參考看看。
Thumbnail
此章節旨在解釋Swift語言中函數的基本結構和操作方式,包括函數的聲明、呼叫、參數和返回值。閱讀這個章節可以幫助你理解並掌握如何在Swift編程中有效地使用和管理函數。
Thumbnail
本篇介紹了Swift程式語言中的各種流程控制元素,包括條件語句(如if, else if, else),三元運算子,多條件分支判斷的switch語句,以及各種迴圈(如for迴圈,while迴圈,以及repeat-while迴圈)。同時也詳細解釋了如何進行迴圈嵌套,以及如何使用控制迴圈語句。
Thumbnail
此章節旨在介紹Swift程式語言中的基本資料型別,包括整數、浮點數、布林型別、字串、字符、選擇型、型別轉換、自訂型別(包括類、結構和枚舉)、元組型別、集合型別、陣列型別和字典型別。每種型別的說明都包含了程式碼範例,以便讀者更好地理解其應用和使用方式。
Thumbnail
某種程度來說,也算是相當有時間觀念(?)。
夏令時,讓我平白少了一小時。 每年三月最後一週的週六、週日夜間,歐洲時區調整至夏令時,亦即時間撥快一小時。 手機電子鐘這種連線到電腦系統的,會自動調整,可是傳統的壁上時鐘,或是鬧鐘,就得自己手動調整。 不少人和我一樣,總會忘記時間被撥快一小時,以致於當天會有一種迷幻的感覺。
Thumbnail
在網頁開發中,時間與日期的處理是重要且基礎的部分,本文將介紹 JavaScript 中的日期的處理方法,並提供範例程式來協助你理解。