Получите разницу между датами, такими как комментарии Facebook на iOS

Я хочу получить разницу между двумя датами, полученными в формате dot net. Я преобразовал дату в NSDate. Но я не могу получить точную разницу (поля часов, минут и секунд равны нулю) между датами. Я использую метод ниже.

- (NSString*)calculateTimeFromDate :(NSDate*)date {

NSDate *createdDate;
NSDate *todayDate;


NSDateFormatter *formatter = [[NSDateFormatter alloc] init];

[formatter setTimeZone:[NSTimeZone timeZoneWithName:@"IST"]];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:SS"];

NSString *str = [formatter  stringFromDate:date];
NSString *str1= [formatter stringFromDate:[NSDate date]];


createdDate = [formatter dateFromString:str];;
todayDate = [formatter dateFromString:str1];

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];


NSUInteger unitFlags = NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;

NSDateComponents *components = [gregorian components:unitFlags
                                            fromDate:createdDate
                                              toDate:todayDate options:0];
NSInteger timeDifference = [components day];

int days = timeDifference;
NSString *timeStr;
if(days>0) {

    if(days == 1)  timeStr = [NSString stringWithFormat:@"%.0i %@",days, LString(@"DAY")];
    else           timeStr = [NSString stringWithFormat:@"%.0i %@ ",days, LString(@"DAYS")];
   } else {

    int hours = [components hour];
    if(hours >0){

        if(hours ==1)  timeStr = [NSString stringWithFormat:@"%.0i %@",hours, LString(@"HOUR")];
        else           timeStr = [NSString stringWithFormat:@"%.0i %@",hours, LString(@"HOURS")];
    } else {

        int minutes = [components minute];
        if(minutes>0) {

            if(minutes ==1 )   timeStr = [NSString stringWithFormat:@"%.0i %@",minutes, LString(@"MINUTE")];
            else               timeStr = [NSString stringWithFormat:@"%.0i %@",minutes, LString(@"MINUTES")];
        } else {

            int seconds =[components second];
            if(seconds >5)  timeStr=[NSString stringWithFormat:@"%.0i %@",seconds, LString(@"SECONDS")];
            else            timeStr = LString(@"JUST_NOW");
        }
    }
}
if(![timeStr isEqualToString:LString(@"JUST_NOW")])   timeStr = [timeStr stringByAppendingFormat:@" %@", LString(@"AGO")];
NSLog(@"%@",timeStr);
return timeStr;
}

person arunit21    schedule 24.08.2013    source источник
comment
В приведенном выше методе *str, *str1 у меня есть точное время и дата, но я не могу получить правильную дату в компонентах. Фактическая дата, данная мне, - Дата (1377216000000). Пожалуйста, предложите свои ответы...   -  person arunit21    schedule 24.08.2013
comment
-1 так вопрос не в выложенном вами коде а в том как превратить Date(1377216000000) в NSDate? Может быть, вы должны были спросить об этом. Код, который вы разместили, работает хорошо.   -  person Matthias Bauch    schedule 24.08.2013
comment
Я преобразовал дату в формат nsdate. Но при регистрации даты компоненты часов и минут равны нулю. Когда я устанавливаю точку останова и навожу курсор на объект даты, я могу видеть часы, минуты, секунды. В чем именно проблема.   -  person arunit21    schedule 24.08.2013


Ответы (3)


попробуйте это: https://github.com/jonhocking/PrettyTimestamp

Это действительно крутая категория на NSDate, которая возвращает разницу между двумя датами в виде красивой строки, например «минуту назад».

Если это не совсем то, что вы хотите, я уверен, что это поможет вам в правильном направлении, или его можно изменить, чтобы вернуть строку, как вам нравится.

person Community    schedule 24.08.2013

• Разницу между двумя датами можно рассчитать с помощью - (NSTimeInterval)timeIntervalSinceDate:(NSDate *)anotherDate.

NSTimeInterval timeInterval  = [todayDate timeIntervalSinceDate:createdDate];

• Преобразование timeInterval в часы, минуты и секунды.

int minutes = floor(timeInterval/60);
int seconds = trunc(timeInterval - minutes * 60);
int hours = minutes / 60;
person Savitha    schedule 24.08.2013
comment
Не рекомендуется использовать временные интервалы для вычислений в календарных единицах. Если, например, была дополнительная секунда, ваши расчеты могли быть ошибочными. Кроме того, если вы предположили, что в сутках 24 часа, а затем закончилось или началось летнее время, вы бы потеряли час. - person Carl Veazey; 24.08.2013

Не изобретайте велосипед, используйте библиотеку для решения задачи.

Существует несколько проектов github, но этот, на мой взгляд, один из лучших, FormatterKit, создайте и поддерживается Мэттом Томпосоном, автором AFNetworking.

Он отлично работает и поддерживает локализацию.

person Gabriele Petronella    schedule 24.08.2013