Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone Objective-C中计算相对时间的问题_Iphone_Objective C_Cocoa Touch_Nsdate_Nsdateformatter - Fatal编程技术网

Iphone Objective-C中计算相对时间的问题

Iphone Objective-C中计算相对时间的问题,iphone,objective-c,cocoa-touch,nsdate,nsdateformatter,Iphone,Objective C,Cocoa Touch,Nsdate,Nsdateformatter,我有以下数据: ---- ORIGINAL TIME 2011-09-04 12:04:36 FORMATTED TIME 2011-09-04T12:04:36-0700 RELATIVE TIME: 2517s ago ---- ORIGINAL TIME 2011-09-04 11:40:17 FORMATTED TIME 2011-09-04T11:40:17-0700 RELATIVE TIME: 1058s ago ---- ORIGINAL TIME 2011-09-04

我有以下数据:

 ----
ORIGINAL TIME 2011-09-04 12:04:36
FORMATTED TIME 2011-09-04T12:04:36-0700
RELATIVE TIME: 2517s ago
 ----
ORIGINAL TIME 2011-09-04 11:40:17
FORMATTED TIME 2011-09-04T11:40:17-0700
 RELATIVE TIME: 1058s ago
 ----
ORIGINAL TIME 2011-09-04 08:05:00
FORMATTED TIME 2011-09-04T08:05:00-0700
RELATIVE TIME: 3h ago
----
ORIGINAL TIME 2011-09-04 07:16:00
FORMATTED TIME 2011-09-04T07:16:00-0700
RELATIVE TIME: 4h ago
我有一些代码来计算相对时间(我正在传递格式化的时间):

为什么我在2517秒前得到了
2517秒
,而它实际上不应该以秒的形式输出。它应该是410万年前


这种情况下的间隔是
-2517.0
我建议使用
-(NSDateComponents*)组件:(NSUInteger)unitFlags fromDate:(NSDate*)startingDate toDate:(NSDate*)resultDate选项:(NSUInteger)选择
NSCalendar
方法来获取现在和日期之间的相对时间单位,使用类似这样的方法:

NSDate *dateToCompare = pointerToYourDatePulledFromTheStringRep;
NSInteger numberOfUnits;
NSString *unitString;
NSDateComponents *comps = [[NSCalendar currentCalendar] 
                          components:(NSWeekCalendarUnit | 
                                       NSDayCalendarUnit | 
                                      NSHourCalendarUnit | 
                                    NSMinuteCalendarUnit | 
                                    NSSecondCalendarUnit) 
                           fromDate:dateToCompare 
                             toDate:[NSDate date]
                            options:0];
if ([comps week] > 0) {
   numberOfUnits = [comps week];
   unitString = @"week";
} else if ([comps day] > 0) {
   numberOfUnits = [comps day];
   unitString = @"day";
} else if... // hour, minute, second

result = [NSString stringWithFormat:@"%d %@%@",
                                    numberOfUnits,
                                    unitString,
                                    (numberOfUnits != 1 ? @"s" : @"")]; 
                                    // last bit deals with plurality
通过这种方式,操作系统函数可以处理所有复杂的日期计算,您可以获得精确性和多日历兼容性的好处

至于你的问题(技术上)为什么你的秒不是分钟,我猜
seconds\u IN\u MIN
的定义不正确。但是,同样,使用
NSCalendar
会给你一个更可靠的答案。

顺便说一句——如果
interval
-2517.0
,你应该检查
(interval<-60)
。如果所有时间都在过去,则所有宏都应定义为负数,比较应为
。考虑到这一点,我不确定你的时间是怎么安排的


您可能需要执行
(fabs(interval)>秒(单位)
(并将其定义为正值)在你所有的比较中,如果你的时间是在未来还是过去。

你如何定义
SECONDS\u in_MIN
等?你自己做了什么来调试它?@omz
#定义SECONDS\u in_MIN 60
我想你没有向我们展示什么。此外,如果你设置了一个断点并用调试器一步一步地调试,你应该能够在短时间内找到它。这不应该是你的另一个答案的补充,而不是单独的帖子吗?是的,本,如果你有补充,只需更新/编辑到你的原始答案中。啊。如果我把它分成两个不同的方向,我通常会把它分成两部分(一个“la”,现在是完全不同的东西)。但如果社区认为这是一个禁忌,我可以从这里开始做一个。
NSDate *dateToCompare = pointerToYourDatePulledFromTheStringRep;
NSInteger numberOfUnits;
NSString *unitString;
NSDateComponents *comps = [[NSCalendar currentCalendar] 
                          components:(NSWeekCalendarUnit | 
                                       NSDayCalendarUnit | 
                                      NSHourCalendarUnit | 
                                    NSMinuteCalendarUnit | 
                                    NSSecondCalendarUnit) 
                           fromDate:dateToCompare 
                             toDate:[NSDate date]
                            options:0];
if ([comps week] > 0) {
   numberOfUnits = [comps week];
   unitString = @"week";
} else if ([comps day] > 0) {
   numberOfUnits = [comps day];
   unitString = @"day";
} else if... // hour, minute, second

result = [NSString stringWithFormat:@"%d %@%@",
                                    numberOfUnits,
                                    unitString,
                                    (numberOfUnits != 1 ? @"s" : @"")]; 
                                    // last bit deals with plurality