Вопрос

Here is the set up, I have a JSON feed I am using and I want to find the difference between two specific dates called posted_date and planned_expiration_date. They are in an odd format I so I thought I could truncate them down to just the date.I could then use NSTimeInterval to find the difference in seconds.

// Time Interval Left
NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
NSString *startDate = [firstPerson objectForKey:@"posted_date"];
NSString *endDate = [firstPerson objectForKey:@"planned_expiration_date"];

//Ammend the strings to YYYY-MM-DD
[formatter setDateFormat:@"yyyy-mm-dd"];
int newlength = 9;
NSDate *startDateAmmended =[formatter dateFromString:[startDate substringFromIndex:newlength]];
NSDate *endDateAmmended = [formatter dateFromString:[endDate substringFromIndex:newlength]];

Here is the bit I'm not too sure about. The date appears something like this "2013-06-07T13:40:01Z" straight from the feed. I don't know how to deal with the T and Z chars in the date formatter method so I truncate the string with substringFromIndex to make it 10 chars and then attempted the following code.

//Difference in Date
NSTimeInterval *startDifference = [startDateAmmended timeIntervalSinceNow];
NSTimeInterval *endDifference = [endDateAmmended timeIntervalSinceNow];

NSTimeInterval timeDifferenceInSeconds = startDifference - endDifference;

I get the following error, .../JSONParser/ViewController.m:52:21: Initializing 'NSTimeInterval *' (aka 'double *') with an expression of incompatible type 'NSTimeInterval' (aka 'double') at the first two calls to NSTimeInterval.

I am sure I'm going wrong in a few places and I'm sure this isn't the easiest method of doing it. Could anyone recommend how I would fix this issue or an easier way to go about getting the differences between dates?

Это было полезно?

Решение

Your error comes from your lines that say:

NSTimeInterval *startDifference = [startDateAmmended timeIntervalSinceNow];
NSTimeInterval *endDifference = [endDateAmmended timeIntervalSinceNow];

They should be:

NSTimeInterval startDifference = [startDateAmmended timeIntervalSinceNow];
NSTimeInterval endDifference = [endDateAmmended timeIntervalSinceNow];

Or, more simply, don't define those two difference variables at all, and just use:

NSTimeInterval timeDifferenceInSeconds = [endDateAmmended timeIntervalSinceDate:startDateAmmended];

To calculate the difference between two ISO 8601 / RFC 3339 date strings, you can do:

NSDate *startDate = [self dateFromISO8601String:@"2013-06-01T16:27:35Z"];
NSDate *endDate   = [self dateFromISO8601String:@"2013-06-07T13:40:01Z"];

NSTimeInterval elapsed = [endDate timeIntervalSinceDate:startDate];
NSLog(@"Time elapsed (in seconds) is %.0f", elapsed);

where dateFromISO8601String is defined as:

- (NSDate *)dateFromISO8601String:(NSString *)string
{
    static NSDateFormatter *formatter = nil;
    if (formatter == nil)
    {
        formatter = [[NSDateFormatter alloc] init];
        NSLocale *enUSPOSIXLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
        formatter.locale = enUSPOSIXLocale;
        formatter.dateFormat = @"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'";
        formatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
    }
    return [formatter dateFromString:string];
}

Другие советы

You can get the difference in seconds between two NSDate objects like this:

double difference = [startDateAmmended timeIntervalSinceDate:endDateAmmended];

Note that with the substring operation you don't have the time, only the date, so the difference will be in seconds but with steps of whole days.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top