iOS日歷功能

之前項目寫過日歷功能,把這部分提取出來

demo地址

ScreenFlow.gif

主要用到了NSCalendar、NSDateComponents這兩個類
NSCalendar日歷,支持日歷的計算。
NSDateComponents 一個日期是有年月日時分秒組成的,components這個類的作用就是把日期拆分成單獨的年、月、日、時、分、秒

假設(shè)有某個時間為customDate,類型為NSDate,如何知道改日期的具體年份、月、日呢。這個就要用到NSDateComponents:
先說一下NSDateComponents的這個 方法

- (NSDateComponents *)components:(NSCalendarUnit)unitFlags 
fromDate:(NSDate *)date

第一個參數(shù)unitFlags指定日期的日期組件,枚舉類型

NSCalendarUnitEra                 -- 紀(jì)元單位。  
NSCalendarUnitYear                -- 年單位。
NSCalendarUnitMonth               -- 月單位。范圍為1-12
NSCalendarUnitDay                 -- 天單位。范圍為1-31
NSCalendarUnitHour                -- 小時單位。范圍為0-24
NSCalendarUnitMinute              -- 分鐘單位。范圍為0-60
NSCalendarUnitSecond              -- 秒單位。范圍為0-60
NSCalendarUnitWeekOfMonth        -- 月包含的周數(shù)。
NSCalendarUnitWeekOfYear          -- 年包含的周數(shù)。
NSCalendarUnitWeekday             -- 工作日單位。范圍為1-7

第二個參數(shù)傳如對應(yīng)的日期

//根據(jù)系統(tǒng)區(qū)域設(shè)置獲取用戶的當(dāng)前日歷
NSCalendar *calendar = [NSCalendar currentCalendar];
//獲取對應(yīng)包含年月日的日期組件
NSDateComponents *components = [calendar components:(NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) fromDate:customDate];
[components year];//年
[components month];//月
[components day];//日

如何獲取某個日期的上一個月和下一個月,需要用到NSCalendar的日期計算:

- (nullable NSDate *)dateByAddingComponents:(NSDateComponents *)comps toDate:(NSDate *)date options:(NSCalendarOptions)opts;
//上一個月
- (NSDate *)lastMonth:(NSDate *)date{
    NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
    //設(shè)置月份 -1
    dateComponents.month = -1;
    //傳入對應(yīng)日期組件進行計算
    NSDate *newDate = [[NSCalendar currentCalendar] dateByAddingComponents:dateComponents toDate:date options:0];
    return newDate;
}
//下一個月
- (NSDate*)nextMonth:(NSDate *)date{
    NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
    dateComponents.month = +1;
    NSDate *newDate = [[NSCalendar currentCalendar] dateByAddingComponents:dateComponents toDate:date options:0];
    return newDate;
}

還有就是需要計算某個月總共有幾天

- (NSInteger)totaldaysInMonth:(NSDate *)date{
    NSRange daysInLastMonth = [[NSCalendar currentCalendar] rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:date];
    return daysInLastMonth.length;
}

以及這個日期是從星期幾開始的:

NSCalendar *calendar = [NSCalendar currentCalendar]; 
//設(shè)置每周的起始位置
[calendar setFirstWeekday:1];//1.Sun. 2.Mon. 3.Thes. 4.Wed. 5.Thur. 6.Fri. 7.Sat.
NSDateComponents *comp = [calendar components:(NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) fromDate:date];
[comp setDay:1];
NSDate *firstDayOfMonthDate = [calendar dateFromComponents:comp]; 
//獲取當(dāng)天在這個月的位置
NSUInteger firstWeekday = [calendar ordinalityOfUnit:NSCalendarUnitWeekday inUnit:NSCalendarUnitWeekOfMonth forDate:firstDayOfMonthDate]; 
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容