iOS中NSCalendar使用

NSCalendar封裝了系統如何按照年月日的方式來組織時間,快速獲取日期對象的年月日、時分秒等相關信息。

1.獲取當前時間

NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents  *components  =  [calendar components:NSCalendarUnitMinute | NSCalendarUnitMonth | NSCalendarUnitHour | NSCalendarUnitDay fromDate:[NSDate date]];
NSLog(@"%ld月%ld日%ld時%ld分" ,(long)components.month,(long)components.day,(long)components.hour,(long)components.minute);

2.查看今天是在今年的第幾周

NSCalendar *calendar1 = [NSCalendar currentCalendar];
NSInteger week = [calendar1 ordinalityOfUnit:NSCalendarUnitWeekday inUnit:NSCalendarUnitYear forDate:[NSDate date]];
NSLog(@"今天是今年的第%ld周",(long)week);

3.現在往后3天2小時

NSDateComponents * components2 = [[NSDateComponents alloc] init];
components2.year = 0;
components2.day = 3;
components2.hour = 2;
NSCalendar *calendar3 = [NSCalendar currentCalendar];
NSDate *currentDate = [NSDate date];
NSDate *nextData = [calendar3 dateByAddingComponents:components2 toDate:currentDate options:NSCalendarMatchStrictly];
NSDateFormatter * formatter1 = [[NSDateFormatter alloc] init];
formatter1.dateFormat = @"yyyy年MM月dd日hh時mm分ss秒";
NSString * str1 = [formatter1 stringFromDate:nextData];
NSLog(@"%@",str1);

下面通過兩個常用的小例子來實現
1.需求是一天執行一次某個操作

- (void)setToday:(NSString *)userDefaultsName{
//存儲當前時間
NSCalendar *calendar0 = [NSCalendar currentCalendar];
NSDateComponents *components = [calendar0 components:(NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay) fromDate:[NSDate date]];
NSInteger currentIndex = [[NSString stringWithFormat:@"%ld%ld%ld",(long)components.year,(long)components.month,(long)components.day] integerValue];
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setInteger:currentIndex forKey:userDefaultsName];
[userDefaults synchronize];
}

 //檢測userDefaultsName對應的時間和當前時間相比是否已經超出了一天 yes為已經超出
+(BOOL)exceedOneDay:(NSString *)userDefaultsName{
//取出保存的時間和當前時間進行比較看是否超出一天
NSCalendar *calendar0 = [NSCalendar currentCalendar];
NSDateComponents *components = [calendar0 components:(NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitMonth) fromDate:[NSDate date]];
NSInteger todayTimeInDay = [[NSString stringWithFormat:@"%ld%ld%ld",components.year,components.month,components.day]integerValue];
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSInteger lastTimeInDay = [userDefaults integerForKey:userDefaultsName];

if (todayTimeInDay>lastTimeInDay) {
    //超出一天
    return YES;
}
return NO;
}

2.在某個界面上顯示VIP的截止時間,VIP的時間是一個月

static NSString *const limitDate = @"limitDate";
static NSString *const formatPaymentTime = @"formatPaymentTime";
+ (NSString *)persistLimitTime:(NSString *)paymentTime{

//加這一句的目的是因為在支付時候本地的時間格式是下面的樣子,
//由于項目需求要用到YYYY-MM-dd這種格式
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"YYYYMMddHHmmss"];

NSDate *currentPayTime = [formatter dateFromString:paymentTime];
NSDate *recordDate = [[NSUserDefaults standardUserDefaults] objectForKey:limitDate];

[formatter setDateFormat:@"YYYY-MM-dd"];
formatter.timeZone = [NSTimeZone defaultTimeZone];

NSCalendar *calender = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
//時間比較,這個目的是有可能續費,截至時間需要疊加
if (recordDate) {
    NSComparisonResult result = [calender compareDate:currentPayTime toDate:recordDate toUnitGranularity:NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay];
    if (result==NSOrderedAscending) {
        currentPayTime = recordDate;//截止時間大于當前支付時間
    }
}

//加一個月,VIP 周期
NSDateComponents *monthComponent = [[NSDateComponents alloc] init];
[monthComponent setMonth:+1];
[monthComponent setYear:0];
[monthComponent setDay:0];

NSDate *toDate = [calender dateByAddingComponents:monthComponent toDate:currentPayTime options:0];
NSDateComponents *component = [calender components:NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:toDate];
NSDate *dateNew = [calender dateFromComponents:component];
paymentTime = [formatter stringFromDate:dateNew];

[[NSUserDefaults standardUserDefaults] setObject:dateNew forKey:limitDate];
[[NSUserDefaults standardUserDefaults] setObject:paymentTime forKey:formatPaymentTime];
[[NSUserDefaults standardUserDefaults] synchronize];

return paymentTime;
}

//判斷VIP是否過期  YES:過期/NO:沒過期

+ (BOOL)isExpried{

NSCalendar *calender = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSDate *recordDate = [[NSUserDefaults standardUserDefaults] objectForKey:limitDate];

//時間比較
if (recordDate) {
    NSComparisonResult result = [calender compareDate:[NSDate date] toDate:recordDate toUnitGranularity:NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay];
    return result==NSOrderedDescending?YES:NO;
    
}
return YES;

}

以上有不足之處還望指點。
參考鏈接http://www.lxweimin.com/p/75bb333a7582
更多有關NSCalendar使用請參考http://www.ithao123.cn/content-10808531.html

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • ######先說下需求:選擇日期彈出日歷(跟途牛,攜程等差不多就行。。。行) 初識NSCalendar到寫完日歷的...
    只是個少年閱讀 1,081評論 0 0
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,236評論 25 708
  • 站在前輩的肩膀上前行 UIKit框架和Foundation框架 所有的Mac OS X和IOS程序都是由大量的對象...
    zysmoon閱讀 8,742評論 0 16
  • 在站牌等車時,一個一瘸一拐的蒼老背影闖進我的視線,忘記了那是幾路車,卻一直記得那個老人,一個不被溫柔對待的花甲之人...
    大信砸閱讀 265評論 0 0
  • 10月24日分享 活在當下 還是上周五發生的事情。 在辦公室發現其他班的兩個孩子打打鬧鬧的,不受控...
    吳丹丹丹閱讀 217評論 0 0