Muszę wyświetlać użytkownikowi datę postów w mojej aplikacji, teraz robię to w tym formacie: "Pią, 25 maja". Jak sformatować NSDate, aby przeczytać coś takiego jak "2 godziny temu"? Aby był bardziej przyjazny dla użytkownika.iOS - Przyjazny format NSDate
Odpowiedz
NSDateFormatter
nie może robić takich rzeczy; będziesz musiał ustanowić własne zasady. Chyba coś takiego:
- (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 */
}
}
więc to wydrukować „x minut temu” lub „x godzin temu” do 24 godzin od daty, która będzie zazwyczaj jeden dzień.
Spójrz na FormaterKit https://github.com/mattt/FormatterKit
Utworzony przez mattt który również stworzył AFNetworking.
To powinno zostać ulepszone, a to świetny zestaw stworzony przez świetnego programistę i tak łatwy w użyciu. –
Istnieje około milion sposobów można to zrobić, ale tutaj jest szybkie jeden:
NSString* hoursAgo = [NSString stringWithFormat:@"%.0lf hours ago", fabs([date timeIntervalSinceNow]/3600.0)]
Oczywiście, to nie sprawdza, że date
jest faktycznie z przeszłości, nic nie robi, ale godziny itp. Ale prawdopodobnie masz pomysł.
timeIntervalSinceNow
zwraca liczbę sekund, które upłynęły od danej daty, z liczbami dodatnimi będącymi datą w przyszłości i liczbami ujemnymi będącymi datą w przeszłości. Dostajemy, ile sekund minęło, podzielimy go przez 3600 sekund na godzinę, aby obliczyć godziny, które minęły, a następnie wpisujemy jego wartość bezwzględną do ciągu "n godzin temu".
Jest też SEHumanizedTimeDiff która robi/ma zamiar obsługiwać wiele języków, czy to problem dla Ciebie:
To jest miła, mała biblioteka, a sama lokalizacja zasługuje na oddanie głosu; ponieważ nie ma czegoś takiego, jak żadne inne proponowane rozwiązanie. –
Zgadzam się z @CarlosP. Istnieje już wiele języków stworzonych przez wygląd. – djskinner
Tutaj jest całkiem dobra odpowiedź to zajmie kilka sekund od początku epoki (1 sty 1970) i zwraca ci sformatowany ciąg znaków, taki jak "3 minuty temu". Wystarczy zadzwonić go z obiektu Date tak:
[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"];
}
Jeśli pomoże ci to w głosowaniu, –
Miło, pracował dla mnie. –
Działa idealnie, krótko i słodko :) – iChirag
Chciałam format data jak Facebook robi dla swoich aplikacji mobilnych, więc przeniesiono na tę kategorię NSDate - nadzieja jest przydatna dla kogoś (ten rodzaj rzeczy powinien naprawdę być w standardowej biblioteki!) :)
Przeszedłem przez twoją bibliotekę i było bardzo użyteczne. Ale w bibliotece, rzeczy takie jak "właśnie teraz", "6 minut temu", "7 godzin temu" działają dobrze. Ale chcę także rzeczy typu "3 dni temu", "4 tygodnie temu", "2 lata temu". Jak to zrobić? –
Zostało stworzone, aby naśladować styl daty w formacie Facebook. To ma być czytelne dla ludzi i łatwe do zrozumienia (dużo zastanowili się, jak najlepiej przedstawić datę i myślę, że jest całkiem jasne, kiedy go używasz, że jest to dobry format.) Rzeczy jak 4 tygodnie temu doesn Dajesz wystarczająco szczegółowe informacje, gdy patrzysz na odstępy czasu z poprzednich przedziałów Jeśli chcesz uzyskać coś takiego, po prostu zmodyfikuj łańcuchy, które są wyprowadzane przez instrukcję if. –
Ale to było wymaganie mojej firmy, a także zamiast tego myślałem wyświetlania "3 października o 12:42", może zająć dużo miejsca, jeśli piszę "1 w" (tydzień temu) –
w nowszych wersjach iOS ponieważ to pytano, NSDateFormatter
miał zdolność ta dodaje. Może teraz zrobić to za pomocą właściwości doesRelativeDateFormatting
.
Nie mogę tego uruchomić.Sprawdzono dokumenty i nie wiem, co robię źle. Jeśli sformatuję do zwykłej daty, otrzymam ciąg znaków, ale jeśli wyzeruję setDoesRelativeDateFormatting, nie otrzymam niczego z powrotem. Pomysły? Przykład kodu? – lostintranslation
Można go znaleźć w niektórych samouczkach za pomocą Google, ale myślę, że powinieneś zamieścić swoje pytanie jako nowe pytanie SO, abyśmy mogli zobaczyć Twój kod! Trudno bez niej poradzić. –
dodanie do roztworu spróbować to bardziej uproszczoną metodę
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];
+(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];
}
Ten kod pokaże czas w ------------ sec jak 2 sekundy temu - ----------- min jak 2 min temu ------------ godziny jak 2 godziny temu ------------ dni jak 2 dni temu ------------ tydzień jak 2 tygodnie temu ------------ miesiąc jak 2 miesiące temu Wreszcie .... roku, jak 2 lata temu :) spróbować tej
- 1. Przyjazny dla użytkownika format czasu w Pythonie?
- 2. Konwersja znacznika czasu na format nsdate
- 3. IOS jak ustawić format daty
- 4. iOS: NSPredicate za pomocą NSDate do porównania
- 5. Konwersja NSDate na ciąg w iOS Swift
- 6. Szyny: Przyjazny dla człowieka format daty dla pola tekstowego
- 7. iOS; Nieobsługiwany format pikseli
- 8. Zaokrąglenie NSDate do najbliższego godzinę w iOS
- 9. iOS - Nie można zapisać NSDate w NSUserDefaults
- 10. Porównywanie NSDate do [data NSDate]
- 11. iOS: Format pliku zapisu dźwięku
- 12. Http Data do NSDate
- 13. Deskryptor sortowania danych rdzenia z NSDate, iOS ze Swiftem
- 14. Konwersja ISO 8601 do NSDate
- 15. Niestandardowy format powiadomień Push systemu iOS
- 16. iOS: format daty - 20 września 2012 r.
- 17. Co to jest wtrysk przyjazny?
- 18. Jak dodawać zwykłe skróty Format daty w systemie iOS, np. "Th", "st"
- 19. Jak mogę uzyskać NSDate z wczoraj
- 20. Jak otrzymać NSDate na 00:00 w dniu [data NSDate]?
- 21. NSDateComponents of NSDate
- 22. NSDate z NSString
- 23. jeśli NSDate to poniedziałek
- 24. NSDate - rok temu, dylemat
- 25. NSDate - Ustawianie przyszłej daty
- 26. NSDate ze stringa
- 27. NSDate dzień roku (swift)
- 28. Jak NSLog NSDate?
- 29. NSDate z NSDateComponents
- 30. NSDate, porównując dwie daty
możliwy duplikat [inteligentnego formatowania przedziale czasowym] (http://stackoverflow.com/questions/5741952/smart-formatting-of-time-span) – dasblinkenlight
wyboru [ ta odpowiedź] (http://stackoverflow.com/a/34359788/1106035), która ma przykładowy link. –