美文网首页iOS进阶之路
iOS中NSCalendar使用

iOS中NSCalendar使用

作者: winning_ | 来源:发表于2016-12-07 16:50 被阅读4585次

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.jianshu.com/p/75bb333a7582
更多有关NSCalendar使用请参考http://www.ithao123.cn/content-10808531.html

相关文章

  • iOS中NSCalendar使用

    NSCalendar封装了系统如何按照年月日的方式来组织时间,快速获取日期对象的年月日、时分秒等相关信息。 1.获...

  • iOS之时间相关

    在iOS中,我们处理时间的时候,往往会使用到NSDate这个类,但是有的时候我们或许也会使用到NSCalendar...

  • iOS关于NSCalendar的使用

    由于最近项目需要,关于VIP截止时间的处理:项目需求时这样的:支付完成之后在某个界面上显示VIP的截止时间,VIP...

  • 关于昨天、明天的判断

    从iOS 8开始,苹果在NSCalendar中为我们直接提供了用于昨天和今天判断的API 在iOS 8之前,还是需...

  • iOS NSCalendar

    1:父类 2: 属性 3:方法

  • NSCalendar使用

    一、NSCalendar NSCalendar可以很方便的用来表示日期,获取日期的各种信息,包括年、月、日,时分秒...

  • iOS--开发中当时间遇到夏令时

    最近巧合地发现一个小问题:有时在iOS开发中我们会用到NSDate、NSCalendar、NSDateCompon...

  • iOS NSCalendar的使用,制作日历

    本文不讲UI,用打印台来输出日历。 在显示日历的时候,我们只需要传入参数年月即可,加上日期可以定位到当天在日历上的...

  • iOS 日历 NSCalendar

    NSCalendar 是 iOS 获取日历数据的工具类。 获取指定月份的天数: 获取指定日期的是周几,在 NSCa...

  • iOS日历(NSCalendar)

    代理 Block两种回调方式 collectionStyle 设置 横向 竖向 两种日历 demo通道

网友评论

    本文标题:iOS中NSCalendar使用

    本文链接:https://www.haomeiwen.com/subject/eelbpttx.html