處理時間和日期是軟件開發中很常見的操作,幾乎所有的編程語言都提供了對應的 API 來方便開發者對時間日期進行處理,Swift 也不例外,比如 DateFormatter ,使用它你可以將任意 日期 轉換成自定義格式的文本字符串。
——但是, DateFormatter 很慢!它是一個非常耗時的操作,從創建到使用,每一步都佔用了大量的時間,如果不是必要,幾乎所有的高級程序員都不會建議你使用這個對象。
老生常談的 C 語言
Swift 是可以直接調用 C 語言的,除了 Foundation 裡的 DateFormatter ,其實你還可以選擇C 的strftime ,它比起前者少了不少高級功能,但如果你的需求僅僅是格式化輸出時間,那 的strftime 將非常好用。
優點(相對 DateFormatter 來說):
- 速度快,同樣的操作 DateFormatter 要 1.4 ms 完成,而 的strftime 只需要0.2 ms,甚至更快!
- 內存佔用小,由於沒有 DateFormatter 那樣複雜的功能,非常節約內存資源。
缺點:
- 代碼上可能沒 DateFormatter 那麼容易操作,畢竟是 C 語言 API,即使是用 Swift 來調用,也會非常痛苦;
- 不支持時區,最多能獲取當前時區和 utc 時區;
- 格式化操作比較少,常用的都有,但如果要 DateFormatter 那麼多的格式,可能就需要你自己動手處理了。
代碼
好在,複雜的代碼操作也只需要一次性封裝即可,通常與服務器通訊或者為用戶顯示時間,也不需要復雜的時區操作,所以絕大部分的業務場景是可以用 的strftime 代替 DateFormatter 的。
我們寫一個 日期 的 extension 來封裝這個操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
extension Date { func formattedTime(format: String) -> String? { let resultSize = format.count + 200 var result = [Int8](repeating: 0, count: resultSize) var currentTime = time(nil) var time = localtime(¤tTime).pointee guard strftime(&result, resultSize, format, &time) != 0 else { return nil } return String(cString: result, encoding: .utf8) } } |
這裡有些困難的地方在於需要使用 C 指針,但 Swift 又把指針隱藏的很好,總之,我們使用一個 INT8 的數組來保存返回的 C 字符串,最終再將它轉換成 Swift 裡的字符串返回。
格式化
代碼寫好了,就剩下格式問題, 的strftime 和 DateFormatter 的格式不一樣,後者通常是直接使用對應的宏,比如 YYYY 代表了四位數字的年份,而 YY 是兩位數字的年份,前者則使用的佔位符, %和 等同於 YYYY , %和 則等同於 YY ......
的strftime 的完整符號列表見 這裡(英文),這裡(中文)
使用
接下來就可以使用一行代碼實現格式化時間日期輸出了:
1 |
print(Date().formattedTime(format: "%y|%Y|%m|%d|%I|%H|%M|%S|%w")) |
😎
參考文獻
- HTTPS://github.com/aciidb0mb3r/SPM-PkgConfig/blob/master/Sources/POSIX/strftime.swift
- HTTPS://www.runoob.com/python/att-time-strftime.html
- HTTPS://wiki.jikexueyuan.com/project/c/strftime.html
- HTTPS://stackoverflow.com/questions/30932465/how-to-format-string-in-swift-using-strftime
本文由 落格博客 原創撰寫:落格博客 » Swift 使用 strftime 快速格式化時間和日期
轉載請保留出處和原文鏈接:https://www.logcg.com/archives/3309.html