我确信在我拔头发之前就出现了这个问题。我有两个日期 - 一个来自Parse.com上的Object,另一个来自本地。我尝试确定远程对象是否已更新,以便我可以在本地触发操作。
当查看两个对象的NSDate时,它们看起来相同,但是比较显示远程对象更新 - 当检查内部时间(自1970年以来)时,显然存在差异,但为什么呢?当我第一次创建本地对象时,我所做的只是
localObject.updatedAt = remoteObject.updatedAt //both NSDate
但仔细观察,我得到了这个:
Local Time Interval: 1411175940.000000
Local Time: 2014-09-20 01:19:00 +0000
Remote Time Interval: 1411175940.168000
Remote Time: 2014-09-20 01:19:00 +0000
有没有人知道为什么会这样,我是否可以忽略这个细节? iOS是圆形还是什么?
添加更多代码:
@property (strong, nonatomic) NSDate *date;
...
PFQuery *query = [PFObject query];
[query whereKey:@"Product" equalTo:@"123456"]
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
if (!error)
{
self.date = objects[0].updatedAt;
NSTimeInterval localTime = [self.date timeIntervalSince1970];
NSTimeInterval remoteTime = [objects[0].updatedAt timeIntervalSince1970];
NSLog(@"Local Time Interval: %f", localTime);
NSLog(@"Local Time: %@", self.date);
NSLog(@"Remote Time Interval: %f", remoteTime);
NSLog(@"Remote Time: %@", objects[0].updatedAt);
}
else
{
NSLog(@"Error with query");
}
}];
这导致上面的控制台输出 - 我不明白为什么这些日期不同。
答案 0 :(得分:3)
我无法解释为什么存在差异,但重要的是要理解可能存在差异,并且在比较日期时必须使用容差值
Apple Date and Time Programming Guide有一个示例,说明如何比较给定容差中的两个日期:
要比较日期,您可以使用
isEqualToDate:
,compare:
,laterDate:
和earlierDate:
方法。这些方法执行准确 比较,这意味着他们检测到亚秒之间的差异 日期。您可能希望以较小的粒度比较日期。对于 例如,如果它们在a中,您可能需要考虑两个相等的日期 彼此分钟。如果是这种情况,请使用timeIntervalSinceDate:
比较这两个日期。以下代码片段显示了如何使用timeIntervalSinceDate:
查看两个日期是否在一分钟内(60 彼此的秒数。if (fabs([date2 timeIntervalSinceDate:date1]) < 60) ...
由您决定公差值,但0.5秒之类似乎是合理的:
+ (BOOL)date:(NSDate *)date1
equalsDate:(NSDate *)date2
{
return fabs([date2 timeIntervalSinceDate:date1]) < 0.5;
}
答案 1 :(得分:1)
Parse将日期存储为iso8601格式。这使事情变得非常复杂,因为Apple没有很好地管理格式。虽然标准的想法很棒,但在每个人都按照相同的规则行事之前,无政府主义规则......
在尝试任何关于日期时间值的任何内容之前,我将所有入站从解析转换为可用格式。
将其放入某个地方的图书馆,可以节省大量的麻烦。这需要花费数周时间进行搜索和刮擦才能克服。
+ (NSDate *)convertParseDate:(NSDate *)sourceDate {
NSDateFormatter *dateFormatter = [NSDateFormatter new];
NSString *input = (NSString *)sourceDate;
dateFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
// Always use this locale when parsing fixed format date strings
NSLocale* posix = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
dateFormatter.locale = posix;
NSDate *convertedDate = [dateFormatter dateFromString:input];
assert(convertedDate != nil);
return convertedDate;
}