2015-04-15 2 views
0

Я хочу добавить пользовательскую ячейку UILabel в мою ячейку, показывая, как давно был опубликован элемент. Любые хорошие ссылки там для простого, как?Получение времени, прошедшего как UILabel (цель-c)

Я хочу добавить ярлык в свою ячейку в раскадровке, назначить ему тег из , а затем программно рассчитать время с момента публикации пользователем элемента.

EDIT: Меня не интересует мое значение nil, поэтому я изменил свой код ниже. Теперь может ли кто-нибудь указать мне в правильном направлении добавить временную метку или бросить мне кость? Высокой оценка

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
static NSString *identifier = @"cell"; 


UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath]; 

// Configure the cell... 

PFObject *group = [self.groups objectAtIndex:indexPath.row]; 

UILabel *nameLabel = (UILabel*) [cell viewWithTag:101]; 
nameLabel.text = [group objectForKey:@"name"]; 
UILabel *usernameLabel = (UILabel*) [cell viewWithTag:103]; 
usernameLabel.text = [group objectForKey:@"creatorName"]; 


return cell; 
} 
+0

Не используйте предложение if (cell == nil), когда вы используете dequeueReusableCellWithIdentifier: forIndexPath :. Ячейка * никогда не будет равна нулю. – rdelmar

+0

хорошо, что приятно знать круто. Но вернемся к моему вопросу - если мне нужен ярлык с меткой «время с момента размещения», как бы я это сделал? @rdelmar –

+0

@rdelmar, в каком документе он утверждает, что ячейка не будет равна нулю? Изначально в tableView не будет никакой ячейки, там метод dequeue вернет вам нуль. –

ответ

1
postedDate = // NSDate object of your postedDate 
[postedDate timeIntervalSinceDate:[NSDate date]; 

Вернет секунды между датами, а затем просто использовать некоторую математику, чтобы получить минуты

+0

Хорошо, скажите им, создавая объект, который затем будет отображаться на начальном экране после загрузки, мне нужно сохранить этот «отправленный» при создании указанного объекта или я могу просто ссылаться на «postDate» после того, как я создаю свой клетки? @Andyy –

+0

@JackCowan да, вам нужно иметь ссылку на опубликованную дату, чтобы получить разницу между опубликованной датой и текущей датой. –

0
NSString *strTime=[aryNewsFeedData valueForKey:@"created"][section]; 

int days,hours,minutes; 

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
    [formatter setDateFormat:@"YYYY-MM-dd'T'HH:mm:ss.SSS'Z'"]; 
    NSDate *chatTime = [formatter dateFromString:strTime]; 

    NSDate *now =[formatter dateFromString:resultString]; 

    NSTimeInterval secondsBetween = [now timeIntervalSinceDate:chatTime]; 

    days   = secondsBetween/(60 * 60 * 24); 
    secondsBetween -= days * (60 * 60 * 24); 
    hours   = secondsBetween/(60 * 60); 
    secondsBetween -= hours * (60 * 60); 
    minutes   = secondsBetween/60; 
+0

хороший человек - так что, если бы я хотел использовать это, чтобы создать время с момента размещения UILabel в моей ячейке, как бы я использовал то, что вы отправили, чтобы сделать это? О, и я использую синтаксический анализ - так это было бы как NSString * strTime = [group objectForKey @ "createdAt], а затем все это? спасибо @Rahul –

0

Если у вас есть размещенная дата как NSDate, имеет вид на NSCalendar с -components:fromDate:toDate:options, чтобы получить прошедшее время. Это даст вам отдельные компоненты (часы, минуты, секунды ... все, что вы просите)

0
NSDateFormatter *df = [NSDateFormatter new]; 
    NSString *SomeDate = @"22 04 2015"; 
    [df setDateFormat:@"dd MM yyyy"];  //Remove the time part 
    NSString *TodayString = [df stringFromDate:[NSDate date]]; 
    NSDate *sdate = [df dateFromString:stringDate]; 
    NSString *TargetDateString = [df stringFromDate:sdate]; 
    NSTimeInterval time = [[df dateFromString:TargetDateString] timeIntervalSinceDate:[df dateFromString:TodayString]]; 
    int days = time/60/60/ 24; 
    _lableText.text = [NSString stringWithFormat:@"%d",days]; 

date-and-time-examples И How to calculate time difference in minutes between two dates in iOS
Переход через эти ссылки.

Это может поможет вам :)

0

Заканчивать FormatterKit. Я считаю, что это то, что вы ищете.

Кроме того, когда я не знал о существовании этой библиотеки, я сделал этот простой метод класса, который возвращает отформатированную временную метку относительно текущего времени (работает для временных меток unix). Просто передайте метку времени UNIX в виде строки к нему, и он возвращает строку с соответствующей отметкой времени по отношению к текущему времени:

+ (NSString*) getTimestampForDate:(NSString*)dateString { 

    NSDate* sourceDate = [NSDate dateWithTimeIntervalSince1970:[dateString doubleValue]]; 

    NSDate* currentDate = [NSDate date]; 

    NSCalendar* currentCalendar = [NSCalendar currentCalendar]; 
    NSCalendarUnit unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit; 

    NSDateComponents *differenceComponents = [currentCalendar components:unitFlags fromDate:sourceDate toDate:currentDate options:0]; 

    NSInteger yearDifference = [differenceComponents year]; 
    NSInteger monthDifference = [differenceComponents month]; 
    NSInteger dayDifference = [differenceComponents day]; 
    NSInteger hourDifference = [differenceComponents hour]; 
    NSInteger minuteDifference = [differenceComponents minute]; 

    NSString* timestamp; 

    if (yearDifference == 0 
     && monthDifference == 0 
     && dayDifference == 0 
     && hourDifference == 0 
     && minuteDifference <= 2) { 

     //"Just Now" 

     timestamp = @"Just Now"; 

    } else if (yearDifference == 0 
       && monthDifference == 0 
       && dayDifference == 0 
       && hourDifference == 0 
       && minuteDifference < 60) { 

     //"13 minutes ago" 

     timestamp = [NSString stringWithFormat:@"%ld minutes ago", (long)minuteDifference]; 

    } else if (yearDifference == 0 
       && monthDifference == 0 
       && dayDifference == 0 
       && hourDifference == 1) { 

     //"1 hour ago" EXACT 

     timestamp = @"1 hour ago"; 

    } else if (yearDifference == 0 
       && monthDifference == 0 
       && dayDifference == 0 
       && hourDifference < 24) { 

     timestamp = [NSString stringWithFormat:@"%ld hours ago", (long)hourDifference]; 

    } else { 

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

     NSString* strDate, *strDate2 = @""; 

     if (yearDifference == 0 
      && monthDifference == 0 
      && dayDifference == 1) { 

      //"Yesterday at 10:23 am", "Yesterday at 5:08 pm" 
      [formatter setDateFormat:@"hh:mm a"]; 
      strDate = [formatter stringFromDate:sourceDate]; 

      timestamp = [NSString stringWithFormat:@"Yesterday at %@", strDate]; 

     } else if (yearDifference == 0 
        && monthDifference == 0 
        && dayDifference < 7) { 

      //"Tuesday at 7:13 pm" 

      [formatter setDateFormat:@"EEEE"]; 
      strDate = [formatter stringFromDate:sourceDate]; 
      [formatter setDateFormat:@"hh:mm a"]; 
      strDate2 = [formatter stringFromDate:sourceDate]; 

      timestamp = [NSString stringWithFormat:@"%@ at %@", strDate, strDate2]; 

     } else if (yearDifference == 0) { 

      //"July 4 at 7:36 am" 

      [formatter setDateFormat:@"MMMM d"]; 
      strDate = [formatter stringFromDate:sourceDate]; 
      [formatter setDateFormat:@"hh:mm a"]; 
      strDate2 = [formatter stringFromDate:sourceDate]; 

      timestamp = [NSString stringWithFormat:@"%@ at %@", strDate, strDate2]; 

     } else { 

      //"March 24 2010 at 4:50 am" 

      [formatter setDateFormat:@"d MMMM yyyy"]; 
      strDate = [formatter stringFromDate:sourceDate]; 
      [formatter setDateFormat:@"hh:mm a"]; 
      strDate2 = [formatter stringFromDate:sourceDate]; 

      timestamp = [NSString stringWithFormat:@"%@ at %@", strDate, strDate2]; 
     } 

     [formatter release]; 
    } 

    return timestamp; 
} 
0

Я использую этот метод и дать ему NSDate или (NSString моей даты) из мой элемент как параметр. (в моем случае, сообщение). Просто удалите первый бит с форматами даты, если вы хотите передать NSDate. (Лично я использую два метода отдельно)

+ (NSString *)dateDiff:(NSString *)origDate{ 

    NSDateFormatter *df = [[NSDateFormatter alloc] init]; // 
    [df setFormatterBehavior:NSDateFormatterBehavior10_4]; // remove this is you want to pass an NSDate as parameter. 
    [df setDateFormat:@"yyyy-MM-dd HH:mm:ss.SSS"];   // 
    NSDate *convertedDate = [df dateFromString:origDate]; // 

    NSDate *todayDate = [NSDate date]; 
    double ti = [convertedDate timeIntervalSinceDate:todayDate]; 
    ti = ti * -1; 

    if(ti < 1) { 
     return NSLocalizedString(@"REL_TIME_NOW", nil); 
    } else if (ti < 60) { 
     return NSLocalizedString(@"REL_TIME_LESS_THAN_MINUTE", nil); 
    } else if (ti < 3600) { 
     int diff = round(ti/60); 
     if (diff < 2){ 
      return [NSString stringWithFormat:NSLocalizedString(@"REL_TIME_MINUTE", nil), diff]; 
     }else{ 
      return [NSString stringWithFormat:NSLocalizedString(@"REL_TIME_MINUTES", nil), diff]; 
     } 
    } else if (ti < 86400) { 
     int diff = round(ti/60/60); 
     if (diff < 2){ 
      return [NSString stringWithFormat:NSLocalizedString(@"REL_TIME_HOUR", nil), diff]; 
     }else{ 
      return [NSString stringWithFormat:NSLocalizedString(@"REL_TIME_HOURS", nil), diff]; 
     } 
    } else { 
     int diff = round(ti/60/60/24); 
     if (diff < 2){ 
      return [NSString stringWithFormat:NSLocalizedString(@"REL_TIME_DAY", nil), diff]; 
     }else{ 
      return [NSString stringWithFormat:NSLocalizedString(@"REL_TIME_DAYS", nil), diff]; 
     } 
    } 
} 

Здесь локализованной строки:

"REL_TIME_NOW"     = "Right now!"; 
"REL_TIME_LESS_THAN_MINUTE"  = "Less than a minute ago"; 
"REL_TIME_MINUTE"    = "%d minute ago"; 
"REL_TIME_MINUTES"    = "%d minutes ago"; 
"REL_TIME_HOUR"     = "%d hour ago"; 
"REL_TIME_HOURS"    = "%d hours ago"; 
"REL_TIME_DAY"     = "%d day ago"; 
"REL_TIME_DAYS"     = "%d days ago"; 

Я просто не хватает смелости, чтобы заменить их в коде выше. : D

Это вернет строку, которая говорит «3 минуты назад», например, и работает как шарм.

Смежные вопросы