2012-04-09 9 views
9

Ich muss das Datum der Beiträge in meiner App für den Benutzer anzeigen, jetzt mache ich es in diesem Format: "Fr, 25 Mai". Wie würde ich ein NSDate formatieren, um etwas wie "2 Stunden" zu lesen? Um es benutzerfreundlicher zu machen.iOS - Friendly NSDate Format

+1

möglich Duplikat [Smart-Formatierung der Zeitspanne] (http://stackoverflow.com/questions/5741952/smart-formatting-of-time-span) – dasblinkenlight

+0

Prüfung [ diese Antwort] (http://stackoverflow.com/a/34359788/1106035), die Beispielverbindung hat. –

Antwort

8

NSDateFormatter kann sowas nicht machen; Du wirst deine eigenen Regeln festlegen müssen. Ich denke, so etwas wie:

- (NSString *)formattedDate:(NSDate *)date 
{ 
    NSTimeInterval timeSinceDate = [[NSDate date] timeIntervalSinceDate:date]; 

    // print up to 24 hours as a relative offset 
    if(timeSinceDate < 24.0 * 60.0 * 60.0) 
    { 
     NSUInteger hoursSinceDate = (NSUInteger)(timeSinceDate/(60.0 * 60.0)); 

     switch(hoursSinceDate) 
     { 
       default: return [NSString stringWithFormat:@"%d hours ago", hoursSinceDate]; 
       case 1: return @"1 hour ago"; 
       case 0: 
        NSUInteger minutesSinceDate = (NSUInteger)(timeSinceDate/60.0); 
        /* etc, etc */ 
       break; 
     } 
    } 
    else 
    { 
      /* normal NSDateFormatter stuff here */ 
    } 
} 

Also das ist 'vor x Minuten drucken oder ‚x Stunden‘ bis zu 24 Stunden ab dem Zeitpunkt, in der Regel 1 Tag sein wird.

35

Werfen Sie einen Blick auf FormaterKit https://github.com/mattt/FormatterKit

von mattt geschaffen, die auch AFNetworking erstellt.

+1

Dies sollte erhalten upvotes, es ist ein großartiges Kit von einem großen Entwickler erstellt und es ist so einfach zu bedienen. –

3

Es gibt eine Million Möglichkeiten, um über Sie dies tun könnten, aber hier ist ein schnelles eins:

NSString* hoursAgo = [NSString stringWithFormat:@"%.0lf hours ago", fabs([date timeIntervalSinceNow]/3600.0)] 

Natürlich ist dies nicht überprüft, dass date tatsächlich aus der Vergangenheit ist, tut nichts, aber Stunden, usw. Aber Sie bekommen wahrscheinlich die Idee.

timeIntervalSinceNow gibt zurück, wie viele Sekunden seit einem bestimmten Datum vergangen sind, wobei positive Zahlen ein Datum in der Zukunft und negative Zahlen ein Datum in der Vergangenheit sind. Also, wie viele Sekunden vergangen sind, teilen Sie sie in 3600 Sekunden in einer Stunde, um die vergangenen Stunden zu berechnen, und geben Sie dann ihren absoluten Wert in die Zeichenkette "vor n Stunden" ein.

4

Es gibt auch SEHumanizedTimeDiff was tut/ist über mehrere Sprachen wenn das ein Problem für Sie zu unterstützen:

https://github.com/sarperdag/SEHumanizedTimeDiff

+1

Dies ist eine nette kleine Bibliothek, und allein die Lokalisierung verdient eine Abstimmung; da es nichts von den anderen vorgeschlagenen Lösungen tut. –

+1

Stimmen Sie mit @CarlosP überein. Es gibt bereits viele Sprachen, die durch die Blicke auch beigetragen werden. – djskinner

3

Hier ist eine ziemlich gute Antwort auf diese dauern wird in Sekunden seit der Epoche (1. Januar 1970) und gebe dir eine schöne formatierte Saite zurück wie 'vor 3 Minuten'. nennen Sie es einfach mit Ihrem Date-Objekt wie folgt:

[timeAgoFromUnixTime:[myDateObject timeIntervalSince1970]]; 

+ (NSString *)timeAgoFromUnixTime:(double)seconds 
{ 
    double difference = [[NSDate date] timeIntervalSince1970] - seconds; 
    NSMutableArray *periods = [NSMutableArray arrayWithObjects:@"second", @"minute", @"hour", @"day", @"week", @"month", @"year", @"decade", nil]; 
    NSArray *lengths = [NSArray arrayWithObjects:@60, @60, @24, @7, @4.35, @12, @10, nil]; 
    int j = 0; 
    for(j=0; difference >= [[lengths objectAtIndex:j] doubleValue]; j++) 
    { 
     difference /= [[lengths objectAtIndex:j] doubleValue]; 
    } 
    difference = roundl(difference); 
    if(difference != 1) 
    { 
     [periods insertObject:[[periods objectAtIndex:j] stringByAppendingString:@"s"] atIndex:j]; 
    } 
    return [NSString stringWithFormat:@"%li %@%@", (long)difference, [periods objectAtIndex:j], @" ago"]; 
} 
+1

Wenn es Ihnen hilft, wählen Sie bitte –

+0

Nizza, arbeitete für mich. –

+0

Es funktioniert perfekt und kurz und süß :) – iChirag

6

Ich wollte ein Datumsformat wie Facebook hat für ihre mobilen Anwendungen, damit ich diese NSDate Kategorie gepeitscht - wirklich hoffen, dass es für jemanden (diese Art von Sachen nützlich ist, sollte in einer Standard-Bibliothek sein!) :)

https://github.com/nikilster/NSDate-Time-Ago

+0

Ich ging durch Ihre Bibliothek und es war sehr nützlich. Aber in deiner Bibliothek funktionieren Dinge wie "gerade jetzt", "vor 6 Minuten", "vor 7 Stunden" gut. Aber ich will auch Dinge wie "vor 3 Tagen", "vor 4 Wochen", "vor 2 Jahren". Wie bekomme ich das hin? –

+0

Dies wurde erstellt, um den Facebook-Stil des Datumsformats nachzuahmen. Es soll für Menschen lesbar und leicht verständlich sein (sie haben viel darüber nachgedacht, wie man das Datum am besten darstellt und ich denke, es ist ziemlich klar, wenn Sie es verwenden, dass dies ein gutes Format ist. Dinge wie vor 4 Wochen doesn Geben Sie nicht genug spezifische Informationen, wenn Sie vergangene Zeitintervalle betrachten Wenn Sie so etwas bekommen möchten, ändern Sie einfach die Zeichenfolgen, die von der If-Anweisung ausgegeben werden. –

+0

Aber das war die Anforderung meines Unternehmens und auch ich dachte stattdessen von "3. Oktober um 12.42 Uhr", könnte es viel Platz verbrauchen, wenn ich "1 w" (vor einer Woche) schreibe –

3

in neueren Versionen von iOS, da diese Frage gestellt wurde, NSDateFormatter hatte diese Fähigkeit hinzugefügt. Es kann jetzt mit der Eigenschaft doesRelativeDateFormatting tun.

+0

Kann das nicht zur Arbeit. Überprüfte Dokumente und nicht sicher, was ich falsch mache. Wenn ich auf ein reguläres Datum formatiere, erhalte ich eine Zeichenfolge, aber wenn ich cal setDoesRelativeDateFormatting bekomme ich nichts zurück. Ideen? Code Beispiel? – lostintranslation

+0

Sie können es in einigen Tutorials mit Google finden, aber ich denke, Sie sollten Ihre Frage als eine neue SO Frage stellen, damit wir Ihren Code sehen können! Es ist schwer, ohne sie Ratschläge zu geben. –

0

zu der Lösung versuchen, diese einfachere Methode

NSDateComponents *today = [[NSCalendar currentCalendar] components:NSCalendarUnitDay|NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitSecond fromDate:passed toDate:[NSDate date] options:0]; 
    NSTimeInterval interval = [[NSDate date] timeIntervalSinceDate:date]; 

    if (interval < 60) timestampString = [NSString stringWithFormat:@"%d seconds ago" ,today.second]; 
    else if (interval < 60 * 60) timestampString = [NSString stringWithFormat:@"%d minutes ago" ,today.minute]; 
    else if (interval < 60 * 60 * 24) timestampString = [NSString stringWithFormat:@"%d hours ago" ,today.hour]; 
    else timestampString = [NSString stringWithFormat:@"%d days ago" ,today.day]; 
2
+(NSString*)HourCalculation:(NSString*)PostDate 

{ 
    NSLog(@"postdate=%@",PostDate); 
    // [email protected]"2014-04-02 01:31:04"; 
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
    [dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 
    NSTimeZone *gmt = [NSTimeZone timeZoneWithAbbreviation:@"GMT"]; 
    [dateFormat setTimeZone:gmt]; 
    NSDate *ExpDate = [dateFormat dateFromString:PostDate]; 
    NSLog(@"expdate=%@",ExpDate); 
    NSLog(@"expdate=%@",[NSDate date ]); 
    NSCalendar *calendar = [NSCalendar currentCalendar]; 

    NSDateComponents *components = [calendar components:(NSDayCalendarUnit|NSWeekCalendarUnit|NSMonthCalendarUnit|NSYearCalendarUnit|NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit) fromDate:ExpDate toDate:[NSDate date] options:0]; 

// NSLog(@"year=%d",components.year); 
//  
// NSLog(@"month=%d",components.month); 
//  
// NSLog(@"week=%d",components.week); 
//  
// NSLog(@"day=%d",components.day); 
//  
// NSLog(@"hour=%d",components.hour); 
//  
// NSLog(@"min=%d",components.minute); 
//  
// NSLog(@"sce=%d",components.second); 
//  

    NSString *time; 

    if(components.year!=0) 
    { 
     if(components.year==1) 
     { 
      time=[NSString stringWithFormat:@"%ld year",(long)components.year]; 
     } 
     else{ 
      time=[NSString stringWithFormat:@"%ld years",(long)components.year]; 
     }  
    } 
    else if(components.month!=0) 
    { 
     if(components.month==1) 
     { 
      time=[NSString stringWithFormat:@"%ld month",(long)components.month]; 
     } 
     else{ 
      time=[NSString stringWithFormat:@"%ld months",(long)components.month]; 
     } 
     // NSLog(@"%@",time); 
    } 
    else if(components.week!=0) 
    { 
     if(components.week==1) 
     { 
      time=[NSString stringWithFormat:@"%ld week",(long)components.week]; 
     } 
     else{ 
      time=[NSString stringWithFormat:@"%ld weeks",(long)components.week]; 
     } 
     // NSLog(@"%@",time); 
    } 
    else if(components.day!=0) 
    { 
     if(components.day==1) 
     { 
      time=[NSString stringWithFormat:@"%ld day",(long)components.day]; 
     } 
     else{ 
      time=[NSString stringWithFormat:@"%ld days",(long)components.day]; 
     } 
    } 
    else if(components.hour!=0) 
    { 
     if(components.hour==1) 
     { 
      time=[NSString stringWithFormat:@"%ld hour",(long)components.hour]; 
     } 
     else{ 
      time=[NSString stringWithFormat:@"%ld hours",(long)components.hour]; 
     } 
    } 
    else if(components.minute!=0) 
    { 
     if(components.minute==1) 
     { 
      time=[NSString stringWithFormat:@"%ld min",(long)components.minute]; 
     } 

     else{ 
      time=[NSString stringWithFormat:@"%ld mins",(long)components.minute]; 
     } 
     // NSLog(@"time=%@",time); 
    } 
    else if(components.second>=0){ 

     // NSLog(@"postdate=%@",PostDate); 

     // NSLog(@"expdate=%@",[NSDate date ]); 

     if(components.second==0) 
     { 
      time=[NSString stringWithFormat:@"1 sec"]; 
     } 
     else{ 
      time=[NSString stringWithFormat:@"%ld secs",(long)components.second]; 
     } 
    } 
    return [NSString stringWithFormat:@"%@ ago",time]; 

} 

Dieser Code Ihnen Zeit in zeigt ------------ sec wie 2 sec vor - ----------- min wie vor 2 Minuten ------------ Stunden wie vor 2 Stunden ------------ Tage wie 2 vor Tagen ------------ Woche wie vor 2 Wochen ------------ Monat wie vor 2 Monaten Zuletzt .... Jahre wie vor 2 Jahren :) versuchen, dieses