2013-04-09 80 views
0

我有两个字符串来自我的服务器,其中存储了时间,我需要比较两者之间的时间间隔(以分钟为单位),如果需要,则以小时。我应该转换为NSDate还是使用NSString获取目标C中两个NSString之间的差异时间

NSString看看这样的:

NOW 14:22 
LAST TIME 10:18 

编辑#1 因为每个人都在说我使用NSDate的,我转换的数据在我的数据库,以DATETIME,现在我可以使用两个NSDate的比较下面的代码:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"pt_BR"]]; 
    [dateFormatter setDateFormat: @"yyyy-MM-dd HH:mm:ss"]; 

    NSDate *currentDateTimeWithOffset = [NSDate dateWithTimeIntervalSinceNow:[[NSTimeZone localTimeZone] secondsFromGMT]]; 

    NSString *strDate = [dateFormatter stringFromDate:currentDateTimeWithOffset]; 
    NSDate * now = [dateFormatter dateFromString:strDate]; 
NSDate *date = [dateFormatter dateFromString:@"2013-04-09 12:10:18"]; 

NSLog(@"Difference %f",[now timeIntervalSinceDate:date]); 

而结果是:

Difference 864.000000 
NOW 2013-04-09 15:24:42 +0000 
LAST DATE 2013-04-09 12:10:18 

这是正确的吗?差异在几秒钟内?

+0

您有大约5个不同的选项。最简单的是自己破解格式。或者你可以使用NSDateFormatter,有或没有NSCalendar。如果你等待足够长的时间,有人可能会提出一个正则表达式版本。如果您使用NSDateFormatter/NSCalendar,请注意时区陷阱。 – 2013-04-09 17:35:09

回答

4

如果格式比您显示的格式复杂,请考虑使用NSDateFormatter。举个简单的例子:

NSArray *hoursMins = [timeString componentsSeparatedByString:@":"]; 
NSInteger timeInMins = [hoursMins[0] intValue] * 60 + [hoursMins[1] intValue]; 

然后用分钟减去两次。日期格式的方法是这样的:

NSDateFormatter *df = [[NSDateFormatter alloc] init]; 
[df setDateFormat:@"HH:mm"]; 
NSDate *date = [df dateFromString:timeString]; 

您可以在几秒钟内得到使用两个日期之间的差异:

[date timerIntervalSinceDate:anotherDate]; 
+0

hourMins数组中的值不会是字符串吗?你正在计算中的数值。 – 2013-04-09 17:37:05

+0

oops。忘了int值。谢谢。 – danh 2013-04-09 17:38:31

+0

+1为NSDateFormatter示例,这是我将使用的方法。 – 2013-04-09 17:44:23

0

NSDateFormatter是“干净”的方式做到这一点。但是,如果你正在寻找快速和肮脏的,这些是你得到的实际的字符串(包括现在和最后时间),我只是使用特定的NSRange来拉出小时和分钟,并比较它们。

确保虽然您检查了小时,但如果“现在”小时在“最后一次”小时之前,那么您现在将24添加到现在以抛出白天翻转。

-1

由于只有NSStringNSDateFormatter用于获取NSDate

NSDateFormatter *rfc3339DateFormatter = [[NSDateFormatter alloc] init]; 
NSLocale *enUSPOSIXLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; 

[rfc3339DateFormatter setLocale:enUSPOSIXLocale]; 
[rfc3339DateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"]; 
[rfc3339DateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; 

// Convert the RFC 3339 date time string to an NSDate. 
NSDate *date = [rfc3339DateFormatter dateFromString:rfc3339DateTimeString]; 

如果你有好几个小时,分钟和秒的单独值,你可以使用NSCalendar

NSDateComponents *comps = [[NSDateComponents alloc] init]; 
[comps setYear:1965]; 
[comps setMonth:1]; 
[comps setDay:6]; 
[comps setHour:14]; 
[comps setMinute:10]; 
[comps setSecond:0]; 
NSDate *date = [gregorian dateFromComponents:comps]; 
[comps release]; 

和完美的解决方案是使用时间戳而不是NSString。不仅可以很容易地将时间戳转换为NSDateNSDate +dateWithTimeIntervalSinceReferenceDate),然后在需要时转换为NSString,但您也可以通过减法获得时间差。

并与两个NSDate对象的时间差异计算与NSDate -timeIntervalSinceDate

+0

这个答案没有解决问题中的实际问题。 – rmaddy 2013-04-09 18:00:03

+0

@rmaddy这不是复制和粘贴解决方案,我不打算给这个级别的问题无论如何。是的,无论是编辑前后的问题。 – 2013-04-09 19:20:36