iOS技術(shù)文檔No.28 Foundation_NSCalendar日歷

自己是一個懶人,本來想寫一個完整的日歷demo貼出來的油坝,不過代碼太亂懶得整理了嫉戚,這里就給大家兩個地址大家自己看看吧,掌握日歷寫法足夠了
iOS日歷澈圈、NSCalendar初探(基礎(chǔ)篇)彬檀,基礎(chǔ)教學(xué)看這個
帶農(nóng)歷和節(jié)假日的萬年歷,這個陽歷農(nóng)歷節(jié)假日都全了

NSCalendar

NSCalendar
日歷類

Cocoa中對日期和時間的處理 NSCalendar (一)

NSCalendar用于處理時間相關(guān)問題瞬女。比如比較時間前后凤覆、計算日期所的周別等。

  1. 創(chuàng)建或初始化可用以下方法
    + (id)currentCalendar;
    取得當(dāng)前用戶的邏輯日歷(logical calendar)
 
    + (id)autoupdatingCurrentCalendar;
    取得當(dāng)前用戶的邏輯日歷(logical calendar), ......
 
    - (id)initWithCalendarIdentifier:(NSString *)identifier;
    初始化為各種日歷拆魏。identifier的范圍可以是:
       NSGregorianCalendar 陽歷
       NSBuddhistCalendar 佛歷
       NSChineseCalendar 中國日歷
       NSHebrewCalendar 希伯來日歷
       NSIslamicCalendar 伊斯蘭日歷
       NSIslamicCivilCalendar 伊斯蘭民事日歷
       NSJapaneseCalendar 日本日歷
  1. 使用前若有必要可以先做以下設(shè)定
    - (void)setLocale:(NSLocale *)locale;
    設(shè)置區(qū)域
 
    - (void)setTimeZone:(NSTimeZone *)tz;
    設(shè)置時區(qū)
 
    - (void)setFirstWeekday:(NSUInteger)value;
    設(shè)定每周的第一天從星期幾開始盯桦,比如:
    .  如需設(shè)定從星期日開始,則value傳入1
    .  如需設(shè)定從星期一開始通砍,則value傳入2
    .  以此類推
    詳細(xì)信息請參閱FirstWeekday屬性
 
    - (void)setMinimumDaysInFirstWeek:(NSUInteger)value;
    設(shè)定作為(每年及每月)第一周必須包含的最少天數(shù)吮便,比如:
    .  如需設(shè)定第一周最少包括7天运怖,則value傳入7
    詳細(xì)信息請參閱MinimumDaysInFirstWeek屬性
  1. 取回設(shè)定信息用以下方法
    - (NSString *)calendarIdentifier
    返回日歷標(biāo)示符(identifier)。有效的日歷標(biāo)示符包括:
       NSGregorianCalendar
       NSBuddhistCalendar
       NSChineseCalendar
       NSHebrewCalendar
       NSIslamicCalendar
       NSIslamicCivilCalendar
       NSJapaneseCalendar
  
    - (NSLocale *)locale;
    返回日歷指定的地區(qū)信息略号。它將影響???
 
    - (NSTimeZone *)timeZone;
    返回日歷指定的時區(qū)信息。它將影響???
 
    - (NSUInteger)firstWeekday;
    返回日歷指定的每周的第一天從星期幾開始洋闽。缺省為星期天玄柠,即firstWeekday = 1

當(dāng)方法[NSCalendar ordinalityOfUnit: inUnit: fromDate:]
的ordinalityOfUnit參數(shù)為NSWeekdayCalendarUnit,inUnit參數(shù)為NSWeekCalendarUnit時诫舅,
firstWeekday屬性影響它的返回值羽利。具體說明如下:

    .  當(dāng)firstWeekday被指定為星期天(即 = 1)時,它返回的值與星期幾對應(yīng)的數(shù)值保持一致刊懈。比如:
       fromDate傳入的參數(shù)是星期日这弧,則函數(shù)返回1
       fromDate傳入的參數(shù)是星期一,則函數(shù)返回2
    .  當(dāng)firstWeekday被指定為其它值時(即 <> 1)時虚汛,假設(shè)firstWeekday被指定為星期一(即 = 2)匾浪,那么:
       fromDate傳入的參數(shù)是星期一,則函數(shù)返回1
       fromDate傳入的參數(shù)是星期二卷哩,則函數(shù)返回2
       fromDate傳入的參數(shù)是星期日蛋辈,則函數(shù)返回7
 
  - (NSUInteger)minimumDaysInFirstWeek;
    返回日歷指定的第一周必須包含的最少天數(shù)。缺省為1将谊,即minimumDaysInFirstWeek = 1冷溶。

當(dāng)方法[NSCalendar ordinalityOfUnit: inUnit: fromDate:]
的ordinalityOfUnit參數(shù)為NSWeekCalendarUnit,inUnit參數(shù)為NSYearCalendarUnit時瓢娜,
minimumDaysInFirstWeek屬性影響它的返回值挂洛。具體說明如下:

      2005年1月
      日   一   二   三   四   五   六
      --------------------------------
                                     1
       2    3    4    5    6    7    8   
       9   10   11   12   13   14   15  
      16   17   18   19   20   21   22
      23   24   25   26   27   28   29
      30   31  

2005年1月第一周包括1號。
a. 如果將minimumDaysInFirstWeek設(shè)定 = 1
則fromDate傳入1月1號眠砾,方法均返回1 ==> 滿足minimumDaysInFirstWeek指定的天數(shù)(最少1天)虏劲,所以方法將其歸為2005年的第1周
則fromDate傳入1月2-8號,方法均返回2
則fromDate傳入1月9-15號褒颈,方法均返回3
......

b. 如果將minimumDaysInFirstWeek設(shè)定為 > 1柒巫,比如2
   則fromDate傳入1月1號,方法均返回53  ==> 不足2天谷丸,所以方法將其歸為2004年的第53周
   則fromDate傳入1月2-8號堡掏,方法均返回1
   則fromDate傳入1月9-15號,方法均返回2
   ......
       2008年1月
       日   一   二   三   四   五   六
       ---------------------------------
                  1    2    3    4    5
        6    7    8    9   10   11   12
       13   14   15   16   17   18   19
       20   21   22   23   24   25   26
       27   28   29   30   31  

2005年1月第一周包括1-5號共5天刨疼。
a. 如果將minimumDaysInFirstWeek設(shè)定為 <= 5時
則fromDate傳入1月1-5號泉唁,方法均返回1 ==> 滿足minimumDaysInFirstWeek指定的天數(shù)鹅龄,所以方法將其歸為2008年的第1周
則fromDate傳入1月6-12號,方法均返回2
則fromDate傳入1月13-19號亭畜,方法均返回3
......
b. 如果將minimumDaysInFirstWeek設(shè)定為 > 5扮休,比如6
則fromDate傳入1月1-5號,方法均返回53 ==> 當(dāng)周不足6天拴鸵,所以方法將其歸為2007年的第53周
則fromDate傳入1月2-8號玷坠,方法均返回1
則fromDate傳入1月9-15號,方法均返回2
......
當(dāng)方法[NSCalendar ordinalityOfUnit: inUnit: fromDate:]
的ordinalityOfUnit參數(shù)為NSWeekCalendarUnit劲藐,inUnit參數(shù)為NSMonthCalendarUnit時八堡,
minimumDaysInFirstWeek屬性影響它的返回值。以2008年4月為例聘芜, 具體說明如下:

      2008年4月
      日   一   二   三   四   五   六
      ---------------------------------
                 1    2    3    4    5
       6    7    8    9   10   11   12
      13   14   15   16   17   18   19
      20   21   22   23   24   25   26
      27   28   29   30  

2008年4月第一周包括1兄渺、2、3厉膀、4溶耘、5號。
1. 如果將minimumDaysInFirstWeek設(shè)定為小于或等于5的數(shù)
則fromDate傳入4月1-5號服鹅,方法均返回1
則fromDate傳入4月6-12號凳兵,方法均返回2
則fromDate傳入4月13-19號,方法均返回3
....
2. 如果將minimumDaysInFirstWeek設(shè)定為大于5的數(shù)
則fromDate傳入1-5號企软,方法均返回0
則fromDate傳入6-12號庐扫,方法均返回1
則fromDate傳入13-19號,方法均返回2
....

Cocoa中對日期和時間的處理 NSCalendar (二)

其他方法的說明

    - (NSRange)maximumRangeOfUnit:(NSCalendarUnit)unit;
    返回單元的最大范圍仗哨。就Gregorian來說有:
     NSEraCalendarUnit => 0 - 2
     NSYearCalendarUnit => 1 - 10000
     NSMonthCalendarUnit = 1 - 12
     NSDayCalendarUnit = 1 - 31
     NSHourCalendarUnit = 0 - 24
     NSMinuteCalendarUnit = 0 - 60
     NSSecondCalendarUnit = 0 - 60
     NSWeekCalendarUnit = 1 - 53
     NSWeekdayCalendarUnit = 1 - 7
     NSWeekdayOrdinalCalendarUnit = ? (2147483647 - 2147483647)
                                         (NSNotFound - NSNotFound)
    - (NSRange)minimumRangeOfUnit:(NSCalendarUnit)unit;
    返回單元的最小范圍形庭。就Gregorian來說有:
     NSEraCalendarUnit => 0 - 2
     NSYearCalendarUnit => 1 - 10000
     NSMonthCalendarUnit = 1 - 12
     NSDayCalendarUnit = 1 - 28  ***
     NSHourCalendarUnit = 0 - 24
     NSMinuteCalendarUnit = 0 - 60
     NSSecondCalendarUnit = 0 - 60
     NSWeekCalendarUnit = 1 - 52  ***
     NSWeekdayCalendarUnit = 1 - 7
     NSWeekdayOrdinalCalendarUnit = ? (2147483647 - 2147483647)
                                         (NSNotFound - NSNotFound)
    - (NSUInteger)ordinalityOfUnit:(NSCalendarUnit)smaller inUnit:(NSCalendarUnit)larger forDate:(NSDate *)date
    返回某個特定時間(date)其對應(yīng)的小的時間單元(smaller)在大的時間單元(larger)中的順序,比如:
    . 要取得2008/11/12在當(dāng)月的第幾周則可以這樣調(diào)用該方法:
      [calendar ordinalityOfUnit:NSWeekOrdinalCalendarUnit inUnit: NSWeekCalendarUnit forDate: someDate]; 
      注: someDate存放了2008/11/12
    . 要取得1:50分在一天中處于第幾個小時厌漂,則可以這樣調(diào)用該方法:
      [calendar ordinalityOfUnit:NSHourCalendarUnit inUnit: NSDayCalendarUnit forDate: someTime]; 
      注: someTime存放了1:50
    . 其它請參照firstWeekday和minimumDaysInFirstWeek中的說明

    - (NSRange)rangeOfUnit:(NSCalendarUnit)smaller inUnit:(NSCalendarUnit)larger forDate:(NSDate *)date
    返回某個特定時間(date)其對應(yīng)的小的時間單元(smaller)在大的時間單元(larger)中的范圍萨醒,比如:
    . 要取得2008/11/12在所在月份的日期范圍則可以這樣調(diào)用該方法:
      [calendar ordinalityOfUnit:NSDayCalendarUnit inUnit: NSMonthCalendarUnit forDate:fDate]; 
      則返回1-31。注: fDate存放了2008/11/12
    . 要取得2008/02/20在所在月份的日期范圍則可以這樣調(diào)用該方法:
      [calendar ordinalityOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:fDate]; 
      則返回1-29苇倡。注: fDate存放了2008/11/12
 
    - (BOOL)rangeOfUnit:(NSCalendarUnit)unit startDate:(NSDate **)sDate interval:(NSTimeInterval *)unitSecs forDate:(NSDate *)date;
    用于返回日期date(參數(shù))所在的那個日歷單元unit(參數(shù))的開始時間(sDate)富纸。其中參數(shù)unit指定了日歷單元,參數(shù)sDate用于返回日歷單元的第一天旨椒,參數(shù)unitSecs用于返回日歷單元的長度(以秒為單位)晓褪,參數(shù)date指定了一個特定的日期。
    如果startDate和interval均為可計算的综慎,那么函數(shù)返回YES否則返回NO.比如:
    . 要計算2008/01/08日所在的周的第一天:
        ...
        NSDate *dateOut = [NSDate date];
        NSDate **sDate = &dateOut;
 
        NSDateComponents *dc = [[NSDateComponents alloc] init];
        [dc setYear: 2008];
        [dc setMonth: 1];
        [dc setDay: 8];
       
        NSDate *date = [calendar dateFromComponents:dc];
        NSTimeInterval intOut;
        NSTimeInterval *intervalOut = &intOut;
 
        if ([calendar rangeOfUnit:NSMonthCalendarUnit startDate:sDate interval:interval0 forDate:date]){
            NSLog(@"%@", [*sDate description]);
            NSLog(@"%f", *intervalOut);
        }
        else{
            NSLog(@"Can not be calculated!");
        }
        ...
      在控制臺窗口上可以看到:
      2008-01-06 00:00:00 +0800
      604800.000000
      注: 2008-01-06是2008/01/08所在周的第一天涣仿,604800是一周7天的秒數(shù)。     
    . 要計算2008/01/05日所在的周的第一天示惊,在控制臺窗口上可以看到:
      2007-12-30 00:00:00 +0800
      604800.000000
    . 要計算2008/02/06日所在的月的第一天好港,在控制臺窗口上可以看到:
      2007-02-01 00:00:00 +0800
      2505600.000000
      注: 2505600是二月29天的秒數(shù)愉镰。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市媚狰,隨后出現(xiàn)的幾起案子岛杀,更是在濱河造成了極大的恐慌,老刑警劉巖崭孤,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異糊肠,居然都是意外死亡辨宠,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門货裹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嗤形,“玉大人,你說我怎么就攤上這事弧圆「潮” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵搔预,是天一觀的道長霹期。 經(jīng)常有香客問我,道長拯田,這世上最難降的妖魔是什么历造? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮船庇,結(jié)果婚禮上吭产,老公的妹妹穿的比我還像新娘。我一直安慰自己鸭轮,他們只是感情好臣淤,可當(dāng)我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著窃爷,像睡著了一般邑蒋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吞鸭,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天寺董,我揣著相機與錄音,去河邊找鬼刻剥。 笑死遮咖,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的造虏。 我是一名探鬼主播御吞,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼麦箍,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了陶珠?” 一聲冷哼從身側(cè)響起挟裂,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎揍诽,沒想到半個月后诀蓉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡暑脆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年渠啤,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片添吗。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡沥曹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出碟联,到底是詐尸還是另有隱情妓美,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布鲤孵,位于F島的核電站壶栋,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏裤纹。R本人自食惡果不足惜委刘,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鹰椒。 院中可真熱鬧锡移,春花似錦、人聲如沸漆际。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽奸汇。三九已至施符,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間擂找,已是汗流浹背戳吝。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留贯涎,地道東北人听哭。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親陆盘。 傳聞我的和親對象是個殘疾皇子普筹,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,884評論 2 354

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