比较objective-c中的两个日期

时间:2014-09-20 04:21:01

标签: objective-c nsdate nstimeinterval

我确信在我拔头发之前就出现了这个问题。我有两个日期 - 一个来自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");
    }
}];

这导致上面的控制台输出 - 我不明白为什么这些日期不同。

2 个答案:

答案 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;
}