在NSDate中匹配任何一年中的给定日期和月份?

时间:2014-01-09 22:36:08

标签: ios objective-c date nsdate nscalendar

我想设置一个NSDate对象,它可以告诉我指定的日期是否在两个其他日期之间,但忽略了一年。我在我的应用程序中有一些东西在圣诞节做了一些特别的事情,我希望在接下来的几年中能够为它做好未来的证明。我使用以下代码检查当前日期是在12月1日到12月31日之间,但我必须指定年份(2013年)。

我不太确定如何修改它以适用于任何一年 - 因为日期被转换为纯数字值,甚至可以完成吗?

+ (NSDate *)dateForDay:(NSInteger)day month:(NSInteger)month year:(NSInteger)year
{
    NSDateComponents *comps = [NSDateComponents new];
    [comps setDay:day];
    [comps setMonth:month];
    [comps setYear:year];
    return [[NSCalendar currentCalendar] dateFromComponents:comps];
}

- (BOOL)laterThan:(NSDate *)date
{
    if (self == date) {
        return NO;
    } else {
        return [self compare:date] == NSOrderedDescending;
    }
}

- (BOOL)earlierThan:(NSDate *)date
{
    if (self == date) {
        return NO;
    } else {
        return [self compare:date] == NSOrderedAscending;
    }
}

2 个答案:

答案 0 :(得分:2)

听起来你需要做的就是确定NSDate是否会在12月份下降。我相信你可以这样做:

NSDate * now = [NSDate date];
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *nowComponents = [gregorian components:NSMonthCalendarUnit fromDate:now];
if ([nowComponents month] == 12) {
    // It's December, do something
}

如果您不希望被限制在整个月,您可以获得当前日期的月和日组件。

答案 1 :(得分:0)

为了判断一个日期是否在某一年的某个特定日期之后,我会使用以下内容:

// yearlessDate is in the form MMddHHmmss
+BOOL date:(NSDate*)theDate isLaterInYearThan:(NSString*)yearlessDate {
    NSDateFormatter* fmt = [[NSDateFormatter alloc] init];
    fmt.dateFormat = @"MMddHHmmss";
    NSString* theDateFormatted = [fmt stringFromDate:theDate];
    return [theDateFormatted compareTo:yearlessDate] == NSOrderedDescending;
}

通常的注意事项适用于时区,12/24设备设置等。将DateFormatter设为静态对象是最佳选择。