【问题标题】:Match a given day and month in any year in an NSDate?在 NSDate 中匹配任何一年中的给定日期和月份?
【发布时间】:2014-01-09 22:36:07
【问题描述】:

我想设置一个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;
    }
}

【问题讨论】:

  • 根据定义,NSDate 是自某个任意时间参考(1970 年 1 月或 2000 年 1 月,取决于您提出的问题)以来的秒数。它不单独包含月/日/小时/分钟/秒。
  • (当然,尽管您总是可以创建年份始终为 1970 或 2000 或其他任何时间的 NSDate 对象,然后进行比较。但是创建“MMddHHmmss”同样容易(可能更容易)字符串并将其用于所有交易。)
  • (但如果你确实使用了 NSDates,那么上面描述的用于比较 NSDates 的“类别”会更容易,更不容易出错。)

标签: ios objective-c date nsdate nscalendar


【解决方案1】:

听起来您需要做的就是确定 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
}

如果您不想被限制在整个月份,您可以获取当前日期的月份和日期部分。

【讨论】:

  • 这看起来很完美,绝对可以。非常感谢!
【解决方案2】:

要判断某个日期是否晚于某个给定日期,我会使用以下内容:

// 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 设为静态对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-24
    • 2023-03-05
    • 2015-12-25
    • 1970-01-01
    • 1970-01-01
    • 2020-12-08
    • 1970-01-01
    • 2013-01-06
    相关资源
    最近更新 更多