iOS-開發中的時間處理

作App避免不了要和時間打交道,關於時間的處理,裏面有很多門道,遠不是一行API調用,獲取當前系統時間這麼簡單。咱們須要瞭解與時間相關的各類API之間的差異,再因場景而異去設計相應的機制。html

時間的形式編程

在開始深刻討論以前,咱們須要確信一個前提:時間是線性的。即任意一個時刻,這個地球上只有一個絕對時間值存在,只不過由於時區或者文化的差別,處於同一時空的咱們對同一時間的表述或者理解不一樣。這個看似簡單明瞭的道理,是咱們理解各類與時間相關的複雜概念的基石。就像UTF-8和UTF-16其實都是Unicode同樣,北京的20:00和東京的21:00實際上是同一個絕對的時間值。性能優化

GMT框架

人類對於時間的理解還頗有限,但咱們至少能肯定一點:時間的變化是勻速的。時間前進的速度是均勻的,不會忽快忽慢,因此爲了描述時間,咱們也須要找到一個值,它的變化也是以均勻的速度向前變化的。編程語言

說出來你可能不信,咱們人類爲了尋找這個參考值,來精確描述當前的時間值,都經歷了漫長歲月的探索。你能夠嘗試思考下,生活中有什麼事物是隨着時間均勻變化的,它具有的數值屬性,會隨着時間處於絕對的勻速變化狀態。post

前人發現擡頭看太陽是個好辦法,太陽老是按規律的「早起晚落」,並且「亙古不變」,能夠用太陽在一天當中所處的位置來描述當前的時間。後來不一樣地區的文化須要交流,你這裏太陽正高空照,我這可能已經下山了,因此須要有一個公共的你們都承認的地方,以這個地方太陽的位置來作參考着,溝通起來就會方便不少。最後選擇的是英國倫敦的格林尼治天文臺所在地,以格林尼治的時間做爲公共時間,也就是咱們所說的GMT時間(Greenwich Mean Time)。性能

UTC優化

太陽所處的位置變化跟地球的自轉相關,過去人們認爲地球自轉的速率是恆定的,但在1960年這一認知被推翻了,人們發現地球自轉的速率正變得愈來愈慢,而時間前進的速率仍是恆定的,因此GMT再也不被認爲能夠用來精準的描述時間了。設計

咱們須要繼續尋找一個勻速前進的值。擡頭看天是咱們從宏觀方向去尋找答案,科技的發展讓咱們在微觀方面取得了更深的認識,因而有聰明人根據微觀粒子原子的物理屬性,創建了原子鐘,以這種原子鐘來衡量時間的變化,原子鐘50億年纔會偏差1秒,這種精讀已經遠勝於GMT了。這個原子鐘所反映的時間,也就是咱們如今所使用的UTC(Coordinated Universal Time )標準時間。code

接下來咱們看下iOS裏,五花八門的記錄時間的方式。

NSDate

NSDate是咱們平時使用較多的一個類,先看下它的定義:

NSDate objects encapsulate a single point in time, independent of any particular calendrical system or time zone. Date objects are immutable, representing an invariant time interval relative to an absolute reference date (00:00:00 UTC on 1 January 2001).

NSDate對象描述的是時間線上的一個絕對的值,和時區和文化無關,它參考的值是:以UTC爲標準的,2001年一月一日00:00:00這一刻的時間絕對值。

這裏有個概念很重要,咱們用編程語言描述時間的時候,都是以一個時間線上的絕對值爲參考點,參考點再加上偏移量(以秒或者毫秒,微秒,納秒爲單位)來描述另外的時間點。

關於NSDate的使用,能夠參考個人如下幾篇博文

Foundation框架—時間處理對象NSDate

Foundation框架—時間輸出格式NSDateFormatter

Foundation框架-NSCalendar

Foundation框架-NSTimeZone

(轉)Foundation-性能優化之NSDateFormatter

 

 

 

 

 

 

 

 

 

//未完待續

相關文章
相關標籤/搜索