Ios 比较两个日期的月份和日期

Ios 比较两个日期的月份和日期,ios,objective-c,nsdate,Ios,Objective C,Nsdate,我需要设置一个if/else语句,只比较两个日期的月份和日期。其中一个日期是用UIDatePicker选择的,另一个是今天的日期。如果两者的月份和日期相同,则会发生一些事情,如果不是其他事情发生的话 这是我目前设置它的方式,但它不起作用(else语句总是激发)。不确定从这里走到哪里: h m 我以为这会奏效,但事实并非如此。我只需要匹配NSDates的月和日部分,因此我尝试将它们格式化为这些部分并比较字符串。问题是,我总是得到“日期不匹配”这句话,即使日期确实匹配。不知道为什么,我可以用一个解释

我需要设置一个if/else语句,只比较两个日期的月份和日期。其中一个日期是用UIDatePicker选择的,另一个是今天的日期。如果两者的月份和日期相同,则会发生一些事情,如果不是其他事情发生的话

这是我目前设置它的方式,但它不起作用(else语句总是激发)。不确定从这里走到哪里:

h

m

我以为这会奏效,但事实并非如此。我只需要匹配NSDates的月和日部分,因此我尝试将它们格式化为这些部分并比较字符串。问题是,我总是得到“日期不匹配”这句话,即使日期确实匹配。不知道为什么,我可以用一个解释和正确的方法来解决这个问题。

你必须使用

if ([todaysDateString isEqualToString:pickedDateString]) {
而不是

if (todaysDateString == pickedDateString) {
因为您必须比较字符串内容,而不是它们的指针

此外,您还可以使用相同的日期格式化程序优化您的实现:

- (IBAction)buttonToCompareDates:(id)sender {
    dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"MM/dd"];

    // Sets date from date picker
    pickedDate = [datePicker date];
    pickedDateString = [dateFormatter stringFromDate:pickedDate];

    // Sets today's date
    todaysDate = [NSDate date];
    todaysDateString = [dateFormatter stringFromDate:todaysDate];

    // if/else statement 
    if ([todaysDateString isEqualToString:pickedDateString]) {
         label.text = @"The dates match.";
    } else { 
         label.text = @"The dates don't match.";
    }
}
你必须使用

if ([todaysDateString isEqualToString:pickedDateString]) {
而不是

if (todaysDateString == pickedDateString) {
因为您必须比较字符串内容,而不是它们的指针

此外,您还可以使用相同的日期格式化程序优化您的实现:

- (IBAction)buttonToCompareDates:(id)sender {
    dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"MM/dd"];

    // Sets date from date picker
    pickedDate = [datePicker date];
    pickedDateString = [dateFormatter stringFromDate:pickedDate];

    // Sets today's date
    todaysDate = [NSDate date];
    todaysDateString = [dateFormatter stringFromDate:todaysDate];

    // if/else statement 
    if ([todaysDateString isEqualToString:pickedDateString]) {
         label.text = @"The dates match.";
    } else { 
         label.text = @"The dates don't match.";
    }
}

比较字符串可能会起作用,但像这样使用NSCalendar可能更有效:

NSDate *date1, *date2;
NSDateComponents* components1 = [[NSCalendar currentCalendar] components:NSMonthCalendarUnit|NSDayCalendarUnit fromDate:date1];
NSDateComponents* components2 = [[NSCalendar currentCalendar] components:NSMonthCalendarUnit|NSDayCalendarUnit fromDate:date2];
if (components1.month == components2.month && components1.day == components2.day) {
    // same month and day
} else {
    // not same month and day
}

比较字符串可能会起作用,但像这样使用NSCalendar可能更有效:

NSDate *date1, *date2;
NSDateComponents* components1 = [[NSCalendar currentCalendar] components:NSMonthCalendarUnit|NSDayCalendarUnit fromDate:date1];
NSDateComponents* components2 = [[NSCalendar currentCalendar] components:NSMonthCalendarUnit|NSDayCalendarUnit fromDate:date2];
if (components1.month == components2.month && components1.day == components2.day) {
    // same month and day
} else {
    // not same month and day
}

现在,由于iOS 8+,它就像:

NSDateComponents* components1 = [[NSCalendar currentCalendar] components:NSCalendarUnitMonth|NSCalendarUnitDay fromDate:dateArticle];
NSDateComponents* components2 = [[NSCalendar currentCalendar] components:NSCalendarUnitMonth|NSCalendarUnitDay fromDate:frDateNow];

if (components1.month == components2.month && components1.day == components2.day) {
    // same month and day
} else {
    // not same month and day
}

现在,由于iOS 8+,它就像:

NSDateComponents* components1 = [[NSCalendar currentCalendar] components:NSCalendarUnitMonth|NSCalendarUnitDay fromDate:dateArticle];
NSDateComponents* components2 = [[NSCalendar currentCalendar] components:NSCalendarUnitMonth|NSCalendarUnitDay fromDate:frDateNow];

if (components1.month == components2.month && components1.day == components2.day) {
    // same month and day
} else {
    // not same month and day
}

正如我所知,NSString无法与“==”进行比较。您将得到警告“字符串文字的直接比较具有未定义的行为”。尝试等质量字符串method@HuyNghia您完全正确,因为不可能在目标C中重载运算符。正如我所知,NSString无法与“==”进行比较。您将得到警告“字符串文字的直接比较具有未定义的行为”。尝试等质量字符串method@HuyNghia你们是绝对正确的,因为不可能在目标C中重载运算符。嘿,这就解决了它!我从来都不知道这句话的存在,对Objective-C来说还是新鲜事。谢谢你的快速回复。@Dick如果你有很强的C语言背景,学习Objective C会容易得多。嘿,这就解决了它!不知道那条线的存在,对于Objective-C仍然是新手。感谢您的快速回复。@Dick如果您对C语言有很强的背景,学习Objective C会容易得多。对于iOS 8.0+使用
NSCalendarUnitMonth | NSCalendarUnitDay
as
NSMonthCalendarUnit
从iOS 8.0开始,iOS 8.0+使用不推荐使用
NSCalendarUnitMonth | NSCalendarUnitDay
as
NSMonthCalendarUnit
从iOS 8.0开始就不推荐使用