Swift 使用 strftime 快速格式化時間和日期

處理時間和日期是軟件開​​發中很常見的操作,幾乎所有的編程語言都提供了對應的 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 來封裝這個操作:

這裡有些困難的地方在於需要使用 C 指針,但 Swift 又把指針隱藏的很好,總之,我們使用一個 INT8 的數組來保存返回的 C 字符串,最終再將它轉換成 Swift 裡的字符串返回。

格式化

代碼寫好了,就剩下格式問題, 的strftimeDateFormatter 的格式不一樣,後者通常是直接使用對應的宏,比如 YYYY 代表了四位數字的年份,而 YY 是兩位數字的年份,前者則使用的佔位符, % 等同於 YYYY% 則等同於 YY ......

的strftime 的完整符號列表見 這裡(英文),這裡(中文)

使用

接下來就可以使用一行代碼實現格式化時間日期輸出了:

😎

參考文獻

  • 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

關於作者

R0uter

如非聲明,本人所著文章均為原創手打,轉載請註明本頁面鏈接和我的名字。

發表評論

您的電子郵件地址不會被公開. 必填字段標 *