IOS中關于兩個時間點的比對問題(NSDate)

IOS開發(fā)中獲取當前時間的方法是通過NSDate獲取的。而NSDate是時間在計算機系統(tǒng)內(nèi)的絕對概念,具有唯一性,不可變性。但是實際開發(fā)中,常常需要將時間進行某種歷法下的比對(一般常用的是農(nóng)歷、公歷)。那么這時的兩個NSDate就需要利用特定的歷法轉(zhuǎn)化時間戳來比較兩個時間的差值。
這里需要了解相關的3個對象

NSDate            //獲取時間
NSCalendar        //歷法對象
NSDateComponents  //表示的時間默認以公歷(即陽歷)為參考

1.NSDate是獨立于歷法之外的,它只是時間相對于某個時間點的時間差;這點切記
2.NSCalendar對世界上現(xiàn)存的常用的歷法進行了封裝,既提供了不同歷法的時間信息,又支持日歷的計算。

//獲取歷法對象的初始化方法
//方法1
NSCalendar *greCalender = [NSCalendar currentCalendar]; /*初始化一個公歷歷法對象*/
//方法2
NSCalendar *greCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];  /*初始化一個公歷歷法對象*/
/*
NSGregorianCalendar  只是公歷,還支持多種歷法 ,比如NSChineseCalendar
*/

  1. NSDateComponents是按照NSCalendar的歷法,將NSDate轉(zhuǎn)換成我們能夠理解的時間格式。支持年、月、日、時、分、秒。
    dateComponents有非常豐富的關于時間轉(zhuǎn)換、比較等的功能。主要介紹時間的轉(zhuǎn)化和兩個Date的對比。

A 時間戳轉(zhuǎn)化年月日

void timeTestFunction(){
        //初始化公歷歷法
        NSCalendar *greCakendar = [NSCalendar currentCalendar];
        //初始化NSDateComponents對象
        /*
         components即對時間戳可轉(zhuǎn)化的對象格式,比如:
         NSCalendarUnitYear  代表翻譯成年、NSCalendarUnitMonth  代表翻譯成月等等
         注意:需要打印出什么時間單位,這里必須設置。比如需要該時間戳的天,必須有NSCalendarUnitDay,否則是不會轉(zhuǎn)化的
         特殊:NSCalendarUnitWeekOfYear    一年中的第幾周
              NSCalendarUnitWeekOfMonth     一年中的第幾個月
         */
        NSDateComponents * dateComponents = [greCakendar components:NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitWeekOfYear | NSCalendarUnitWeekOfMonth
                                                           fromDate:[NSDate date]];
        
        NSLog(@"年份:%li",(long)dateComponents.year);
        NSLog(@"月份:%li",(long)dateComponents.month);
        NSLog(@"天數(shù):%li",(long)dateComponents.day);
        NSLog(@"小時:%li",(long)dateComponents.hour);
        NSLog(@"本年度第幾周:%li",(long)dateComponents.weekOfYear);
        NSLog(@"本月第幾周:%li",(long)dateComponents.weekOfMonth);
}

B 兩個NSDate對象對比時間差

void calculateTheDifferenceBetweenOldTimeAndNewTime()
{
    //初始化公歷歷法
    NSCalendar *greCalender = [NSCalendar currentCalendar];
    
    /*
     NSDateComponents的另一個用法:設置一個特定的時間單位,并將其轉(zhuǎn)化為NSdate
     */
    NSDateComponents * dateComponents = [[NSDateComponents alloc] init];
    [dateComponents setDay:1];
    [dateComponents setMonth:1];
    [dateComponents setYear:1990];
    
    //根據(jù)設置的dateComponents獲取歷法中對象的時間點
    //這里的是分秒會使用NSDateComponents中規(guī)定的默認數(shù)值,一般為0和1
    NSDate * fromDateComponentsDate = [greCalender dateFromComponents:dateComponents];
    
    //在設置的歷法中,依照比對的條件返回兩個date之間的時間間隔
    NSDateComponents * differenceComponents = [greCalender components:NSCalendarUnitYear
                                                             fromDate:fromDateComponentsDate
                                                               toDate:[NSDate date] options:0];
    NSLog(@"90年距今%li年",differenceComponents.year);
}

C 獲取一個某歷法下XX時間后的時間點

NSCalendar *greCalender = [NSCalendar currentCalendar];
//獲取一個dateComponents并設置時間段
    NSDateComponents * dateComponentsAsTimeSet = [[NSDateComponents alloc] init];
    [dateComponentsAsTimeSet setDay:6];
    //獲取當前歷法下的6天后的時間點
/*
這里還可以自己設年、月、日、時、分、秒,根據(jù)個人需求
*/
    NSDate * setTimeDate = [greCalender dateByAddingComponents:dateComponentsAsTimeSet
                                                        toDate:[NSDate date] options:0];
    NSLog(@"%@",setTimeDate);
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,283評論 6 530
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 97,947評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,094評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,485評論 1 308
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,268評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,817評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,906評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,039評論 0 285
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,551評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,502評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,662評論 1 366
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,188評論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 43,907評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,304評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,563評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,255評論 3 389
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,637評論 2 370

推薦閱讀更多精彩內(nèi)容