iOS 獲取日期 日期格式化 24小時格式

2022-01-12 10:16:34 字數 2319 閱讀 9494

由於專案需要,需要獲取去裝置的當前時間,組成乙個字串,比如 2023年9月15日 15點30分30秒,需要轉換成字串:180915153030。

let currentdate: date! =date()

let dateformatter =dateformatter.init()

dateformatter.dateformat = "

yymmddhhmmss

"let timestr = dateformatter.string(from: currentdate)

就是這段**,自己測試後沒有問題,就提交了,並上線了,可是到客戶那出現了問題。由於我這裡不是展示timestr,而是和另外乙個需求一起使用,導致另外乙個功能失敗。這個隱藏的bug讓我找了乙個多月的時間。在自己手機上測試,找了好幾個手機測試都沒有問題。客戶那使用時出現問題,也沒有往這想,會是這段**出現問題。最終發現是和手機設定的日期格式(12小時制和24小時制有關係)及日曆選擇。

下面就來分析在不同情況下獲取到的字串都啥樣。

1)在設定->通用->日期和時間設定24-hour time關閉

獲取到的時間字串為:18091534200 pm,可以發現yymmddhhmmss這個格式對時間進行了格式化,但是其中的小時沒有格式化為24小時制的,而且後面還多了乙個空格及pm表示下午,可見沒有獲得我們想要的格式,使用者的日期格式的設定會影響到我們獲取到的時間。

2)開啟24-hour time

獲取到的時間字串為:180915154617(時間是執行程式時的時間,所以和上面不同,下同),很明顯,這個獲得了我們想要的字串。

3)在設定->通用->語言和地區中有個日曆(calendar)有三種選擇:gregorian也就是我們用的公曆,上面兩種情況都是在公曆下輸出的結果;japanese也就是日本的日曆,目前叫平成年,2023年就是平成30年。buddhist佛教日曆。

那好我們就設定下日本日曆看看獲取到的是啥:

24小時制下:300915155438,可見除了年份不對外,其它都對,年份是30,也就是平成30年

12小時制下:300915155800,可以發現並沒有上面的pm標記,也就是這個問題導致我這個bug遲遲沒被發現,只有在裝置語言設定為英文並且是公曆的情況下才會輸出pm字尾,平時測試用的簡體中文設定,12小時制,所以客戶出現的錯誤,我這怎麼也復現不了。

咱們再看看佛曆的輸出:

24小時制下:610915160205,可以發現不僅年份不一樣,日以及時間都不對,這個時間是按佛曆計算的,有興趣的話可以查查佛曆。

12小時制下:610915160406,同上,同時也沒有出現pm字尾。

說了這麼多,怎麼才能獲取到需要的時間字串呢?

解決方法如下:

1).設定dateformatter的calendar屬性,就是制定日曆,直接指定公曆,這樣避免了使用使用者的設定

dateformatter.calendar = calendar.init(identifier: .gregorian)

2)這樣還不夠,如果只設定上面的日曆屬性獲取到的時間字串還是帶有pm字尾,而且在12小時制下獲取到的字串也不對,小時並沒有按照24小時格式化,還需要設定local屬性,本地化

dateformatter.locale = locale.init(identifier: "

nl")

上面是設定格式的本地化屬性,其中nl是荷蘭的縮寫,這個解決方法是在**找到的,設定為nl的話,格式時間時就是hh來格式化的,這個應該設定別的國家也可以。至此,只要設定到上面兩個屬性,格式化得到的就是我們想要的格式yymmhhmmss格式了。

另外一種解決方法:

//

獲取當前時間

let currentdate: date! =date()

//一定要使用公曆日曆gregorian

let calendar: calendar! =calendar.init(identifier: .gregorian)

let weekcomps: datecomponents! = calendar.datecomponents([.year, .month, .day, .weekday - 1, .hour, .minute, .second], from: currentdate)

上面獲取的datecomponents物件,裡面有各個日期字段,然後通過拼接字串即可得到想要的字串,這裡不用設定本地化,只需指定公曆即可,在哪種語言下獲取的都是24小時格式的。上面這個還獲取了周,其中周需要減1才能得到當前的星期數。

18091534200 pm

18091534200

小程式 日期格式化

對於後台返回的資料,不一定能直接在前端使用,這個時候就需要做一些資料的處理,這次給大家介紹的是日期的處理 首先我們來看後台返回的資料格式 list 在這串資料裡面,我們可以看到日期有些是一樣的,需求就是要將日期一樣的內容放到一起去,日期只顯示一次,即顯示為 接下來我們進行處理 data format...

日期與日期格式化

public static void main string args 使用before after compareto 函式進行比較 dateformat sdf new dateformat yyyy mm dd hh mm ss string datestring 01 2019 10 01 ...

格式化日期

格式化日期 輸出形式取決於使用者計算機的文化設定。using system using system.globalization public class mainclass string date for int i 0 i format.length i d 07 11 2004 輸出 d su...