如何将"今天"(NSDate)与格式化的字符串日期(dd/MM/yyyy)进行比较?

3

我是iOS编程的新手,一直在寻找比较“今天”(NSDate)和格式化字符串日期(dd/MM/yyyy)的方法。

我已经找到了一些关于NSDate的earlierDatelaterDate等好的答案,但代码似乎在我的项目中不起作用。

这是代码:

// [book quandd]  is the string :    25/02/2011  (or whatever dd/MM/yyyy date)

NSDate *today = [NSDate date];
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"dd/MM/yyyy"];

if ( [[dateFormat dateFromString:[book quandd]] isEqualToDate:today]) {
    NSLog(@"Dates are equal");
}
if ( [[dateFormat dateFromString:[book quandd]] earlierDate:today]) {
    NSLog(@"earlier");
}
if ( [[dateFormat dateFromString:[book quandd]] laterDate:today]) {
    NSLog(@"later");
}

无论我做什么,无论[book quandd]中的日期是什么,控制台总是写着“earlier”和“later”,好像它们比today还要早或晚。

这个“bug”是从哪里来的呢?

有没有一些更容易比较today日期和例如2011年2月26日的方法?


NSDate是一个精确时间。两个时间相等的概率非常小。 - Hot Licks
5个回答

1

NSDate包含日期和时间。除非时间相同到毫秒级别(如果不是更细),否则没有两个NSDate值会相等。当您执行[NSDate date]时,您会得到“现在”的准确时间,而如果您使用NSDateFormatter将字符串转换为日期(没有时间值),则使用午夜。

如果您想查看两个NSDates是否在同一天,可以使用NSCalendar和NSDateComponents。或者,您可以“作弊”,将两个日期格式化为没有时间值的日期字符串,并比较字符串。

- (void) CompareDate:(NSDate*)date1 toDate:(NSDate*)date2 {
    NSDateFormatter* fmt = [NSDateFormatter new];
    [fmt setDateFormat:@"yyyyMMdd"];
    // Note that you should set the appropriate timezone if you don't want the default.
    NSString* date1Str = [fmt stringFromDate:date1];
    NSString* date2Str = [fmt stringFromDate:date2];
    switch ([date1Str compare:date2Str]) {
        case NSOrderedAscending:
            NSLog(@"Date 1 is earlier");
            break;
        case NSOrderedSame:
            NSLog(@"Dates are equal");
            break;
        case NSOrderedDescending:
            NSLog(@"Date 2 is earlier");
            break;
    }
}

0

使用这个

NSDate *today = [NSDate date];
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"dd/MM/yyyy"];

    if ( [[dateFormat dateFromString:[book quandd]] compare:today]==NSOrderedSame) {
        NSLog(@"Dates are equal");
    }
    if ( [[dateFormat dateFromString:[book quandd]] compare:today]==NSOrderedAscending) {
        NSLog(@"earlier");
    }
    if ( [[dateFormat dateFromString:[book quandd]] laterDate:today]==NSOrderedDescending) {
        NSLog(@"later");
    }

谢谢,我明白你的意思了(有一些额外的“[”),但它只适用于早期和晚期,很奇怪...无论如何,我认为timeIntervalSinceNow:与秒值一起使用是有效的... - Adriweb

0

你的“bug”发生在laterDate和earlierDate返回早于或晚于当前日期对象。返回的对象始终是非空的,因此两个if语句都会评估为true。正确使用它们的方法如下:

NSString *book = @"19/08/2014";

NSDate *today = [NSDate date];
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"dd/MM/yyyy"];

NSDate *date = [dateFormat dateFromString:book];
if ( [date timeIntervalSinceDate:today] == 0) {
    NSLog(@"Dates are equal");
}
if ( [date laterDate:today] == today ) {
    NSLog(@"earlier");
}
if ( [date laterDate:today] == date) {
    NSLog(@"later");
}

或者,我使用了timeIntervalSinceDate,它返回第一个日期和第二个日期之间的秒数。

NSString *book = @"19/08/2014";

NSDate *today = [NSDate date];
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"dd/MM/yyyy"];

NSDate *date = [dateFormat dateFromString:book];
if ( [date timeIntervalSinceDate:today] == 0) {
    NSLog(@"Dates are equal");
}
if ( [date timeIntervalSinceDate:today] < 0 ) {
    NSLog(@"earlier");
}
if ( [date timeIntervalSinceDate:today] > 0) {
    NSLog(@"later");
}

0
使用timeIntervalSinceNow:来获取所需日期与当前时间的差异。
您还应该尝试获取它们之间的差异,然后将其转换为字符串。

谢谢,但是当我这样做(使用sinceDate:today)时,用NSLog(@“%f”,dateTime)得到的结果是:dateTime = -36331460.303964,像这样的数字o_O - Adriweb
您将在几秒钟内收到响应,然后您可以将其转换为天或任何其他单位。 - visakh7
谢谢,经过一点比较值的工作,我想我已经让它正常工作了 :) - Adriweb

0

您需要检查 earlierDate 的返回值与所引用的日期之一进行比较。例如:if([date1 earlierDate:date2] == date1)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接