iOS:NSOrderedDescending和NSOrderedAscending存在问题

3

我想比较日期,并使用以下代码:

在一个示例中,我的日期值为: date1 = 6/06/2011 date2 = 8/06/2011

如果dateSelected = 7/06/2011,则一切正常,但是如果dateSelected = 6/06/2011或dateSelected = 8/06/2011,则代码不会进入我的“if”语句,为什么?

if (([dateSelected compare:date1] == NSOrderedDescending) &&
                ([dateSelected compare:date2]== NSOrderedAscending))
            {}
3个回答

3

NSDates代表自2000年1月1日00:00 UTC以来的时间点。因此,所有这些日期都有时间组件。-compare:比较日期和时间。

假设您真正想要检查所选日期是否在6/6/2011 00:00和9/6/2011 00:00之间。另外,您可能希望将日期6/6/2011 00:00视为范围内。因此,您需要类似以下内容:

NSComparisonResult compareStart = [date1 compare: selectedDate]; // date1 is 6/6/2011 00:00
NSComparisonResult compareEnd = [date2 compare: selectedDate];   // date2 is 9/6/2011 00:00

if ((compareStart == NSOrderedAscending) || (compareStart == NSOrderedSame)
    && (compareEnd == NSOrderedDescending))
{
    // date is in the right range
}

我曾经收到过这个警告:“将NSDate发送到NSNumber类型的参数会导致不兼容的指针类型”。 - cyclingIsBetter
@blackguardian:只有在尝试将日期与数字进行比较时才会出现这种情况。您如何设置date1、date2和所选日期? - JeremyP
控制台中的结果为: 2011-06-06 10:31:48.423 Project[173:707] date1:2011-06-06 08:30:57 +0000 2011-06-06 10:31:48.429 Project[173:707] date2:2011-06-08 00:00:00 +0000 2011-06-06 10:31:48.432 Project[173:707] dateSelected:2011-06-07 08:30:37 +0000 - cyclingIsBetter
@blackguardian:我不明白。你所说的“nothing”是什么意思?你期望在日志中看到评论吗? - JeremyP
1
使用我的代码,如果date1 == selectedDate在范围内,这就是为什么我要使用NSOrderedSame进行比较的原因。date2是范围内第一个你不想要的日期,这就是为什么我不使用NSOrderedSame进行比较的原因。 - JeremyP
显示剩余3条评论

0

试试这个:

if (([date1 compare:dateSelected] == NSOrderedAscending) &&
                ([date2 compare:dateSelected]== NSOrderedDescending))
            {}

我收到了一个警告:“不兼容的指针类型,将NSDate发送到类型为NSNumber的参数”。 - cyclingIsBetter
我曾试图利用[a compare:b]与[b compare:a]之间的差异来满足您对范围包含边界的要求...但是无论如何,我认为JeremyP的答案更好。 - Steve

0

对于那些和 @blackguardian 有相同问题的人:

Cannot initialize a parameter of type 'NSNumber *' with an lvalue of type 'NSDate *'


关于这个问题:

NSDate* oldDate = [NSDate date];
BOOL older = ([[NSDate date] compare:oldDate] == NSOrderedDescending);


我不知道为什么,但你需要将“[NSDate date]”转换为“NSDate *”。

这是有效的:

NSDate* oldDate = [NSDate date];
BOOL older = ([[(NSDate*)[NSDate date] compare:oldDate] == NSOrderedDescending);

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