在Objective-C中两次比较最好/最简单的方法是什么?

时间:2010-05-10 17:18:35

标签: objective-c iphone

我有一个时间的字符串表示,如“11:13 AM”。这是使用NSDateFormatter和stringFromDate:方法生成的。

我想将此时间与当前时间进行比较,但是当我使用dateFromString:方法将字符串转换回日期时,会添加年,月和日 - 这是我不想要的。我只需要知道现在是否<或者>存储在字符串中的时间。

最好的办法是什么?在此先感谢您的帮助。

5 个答案:

答案 0 :(得分:9)

使用您从选择器获得的NSDate,而不是使用字符串表示。您可以使用NSDateComponents转换该小时/分钟/秒,然后将[NSDate date]转换为NSDateComponents。比较两组组件的小时/分钟/秒。

编辑 - 使用实用程序功能进行此类操作,将NSDate的hr / min / sec组件转换为secondsOfTheDay(午夜后的秒数)。

您可以直接使用两个时间值,因为它们都是午夜以来的秒数。简单的整数可以很容易地进行比较,存储和操作。您不必一直使用NSDate。

//----------------------------------------------------------------------------
// extracts hour/minutes/seconds from NSDate, converts to seconds since midnight
//----------------------------------------------------------------------------
unsigned secondOfTheDay( NSDate* time )
{
    NSCalendar* curCalendar = [NSCalendar currentCalendar];
    const unsigned units    = NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
    NSDateComponents* comps = [curCalendar components:units fromDate:time];
    int hour = [comps hour];
    int min  = [comps minute];
    int sec  = [comps second];

    return ((hour * 60) + min) * 60 + sec;
}

答案 1 :(得分:4)

如果我正确理解了问题,您使用的是dateFromString: NSDateFormatter方法。这给了你正确的时间,但是默认日期是1970年1月1日,这与当前日期/时间比较没用。

这很容易解决。使用setDefaultDate:将默认日期设置为今天。

NSDate *now = [NSDate date];

NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];
[formatter setDateFormat:@"hh:mm a"];
[formatter setDefaultDate:now];

NSDate *theDate = [formatter dateFromString:@"11:13 AM"];
NSComparisonResult theResult = [theDate compare:now];

答案 2 :(得分:2)

您可以重用用于创建字符串的字符串格式化程序吗?所以,假设你创建了这样的字符串:

NSDateFormatter *formatter = [[[NSDateFormatter alloc] init];
[formatter setDateFormat:@"HH:mm a"];
NSString *dateAsString = [formatter stringFromDate:[NSDate date]];

你可以得到这样的NSDate:

NSDateFormatter *formatter = [[[NSDateFormatter alloc] init];
[formatter setDateFormat:@"HH:mm a"];
NSDate *date = [formatter dateFromString:dateAsString];

不会保留日,月,年和时区信息,但您将拥有一个NSDate对象,其值为1/1/1970,GMT为时区偏移量。

此时,您可以使用compare :(通常保留用于排序操作)或laterDate:或earlyDate:方法。

请谨慎使用NSDateFormatter,因为您可能遇到国际化问题。

如果您需要将有关当前日期的信息添加到dateFromString:中的日期,例如月份日和年份,则需要使用NSCalendar的dateByAddingComponents:toDate:options:method。

答案 3 :(得分:0)

如果字符串最初是从NSDate创建的,那么您将希望使用原始NSDate[NSDate date] NSDate进行比较compare:方法(或某些变体,例如earlierDate:laterDate:)。

答案 4 :(得分:0)

您应该使用基于24小时的NSDateFormatter并比较为字符串(“09:00 am”>“08:00 pm”,但“09:00”<“20:00”)。但一般来说,使用NSDate实例而不是字符串

是正确的