iPhone - nsdatecomponents / nscalendar et temps écoulé (par exemple, scanné il y a 3 heures.)
-
29-10-2019 - |
Question
Je voudrais afficher à l'utilisateur les heures écoulées suivantes:
par exemple,
Scanned 13 seconds ago
Scanned 2 minutes ago
Scanned 1 hour ago
Scanned 2 days ago
Scanned 1 month ago
Scanned 1 year ago
J'utilise la méthode suivante pour y parvenir, mais cela ne fonctionne pas comme je m'y attendais. Par exemple, si je viens de scanner quelque chose, il sort: Scanné il y a 9 secondes 16 heures, ce qui n'est évidemment pas correct. Il devrait être juste: Scanné il y a 9 secondes.
+ (NSString *)elapsedTime:(NSDate *)date {
NSUInteger desiredComponents = NSYearCalendarUnit | NSMonthCalendarUnit | NSWeekCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
NSDateComponents *elapsedTimeUnits = [[NSCalendar currentCalendar] components:desiredComponents
fromDate:date
toDate:[NSDate date]
options:0];
NSString *stringFormat = nil;
stringFormat = [NSString stringWithFormat:@"%@", [elapsedTimeUnits year] > 0 ? ([NSString stringWithFormat: @"%d year%@ ", [elapsedTimeUnits year], [elapsedTimeUnits year] == 1 ? @"" : @"s"]) : @""];
stringFormat = [NSString stringWithFormat:@"%@%@", stringFormat, [elapsedTimeUnits month] > 0 ? ([NSString stringWithFormat: @"%d month%@ ", [elapsedTimeUnits month], [elapsedTimeUnits month] == 1 ? @"" : @"s"]) : @""];
stringFormat = [NSString stringWithFormat:@"%@%@", stringFormat, [elapsedTimeUnits week] > 0 ? ([NSString stringWithFormat: @"%d week%@ ", [elapsedTimeUnits week], [elapsedTimeUnits week] == 1 ? @"" : @"s"]) : @""];
stringFormat = [NSString stringWithFormat:@"%@%@", stringFormat, [elapsedTimeUnits day] > 0 ? ([NSString stringWithFormat: @"%d day%@ ", [elapsedTimeUnits day], [elapsedTimeUnits day] == 1 ? @"" : @"s"]) : @""];
stringFormat = [NSString stringWithFormat:@"%@%@", stringFormat, [elapsedTimeUnits hour] > 0 ? ([NSString stringWithFormat: @"%d hour%@ ", [elapsedTimeUnits hour], [elapsedTimeUnits hour] == 1 ? @"" : @"s"]) : @""];
stringFormat = [NSString stringWithFormat:@"%@%@", stringFormat, [elapsedTimeUnits minute] > 0 ? ([NSString stringWithFormat: @"%d minute%@ ", [elapsedTimeUnits minute], [elapsedTimeUnits minute] == 1 ? @"" : @"s"]) : @""];
stringFormat = [NSString stringWithFormat:@"%@%@", stringFormat, [elapsedTimeUnits second] > 0 ? ([NSString stringWithFormat: @"%d second%@ ", [elapsedTimeUnits second], [elapsedTimeUnits second] == 1 ? @"" : @"s"]) : @""];
return [NSString stringWithFormat:@"Scanned %@ago", stringFormat];
}
La solution
Vous devez vérifier chaque partie puis ajouter
stringFormat = [NSString stringWithFormat: @"%d", [elapsedTimeUnits year] > 0 ? ([NSString stringWithFormat: @"%d year%@", [elapsedTimeUnits year], [elapsedTimeUnits year] == 1 ? @"" : "s"]) : @""];
stringFormat = [NSString stringWithFormat: @"%@%@", stringFormat, [elapsedTimeUnits month] > 0 ? ([NSString stringWithFormat: @"%d month%@", [elapsedTimeUnits month], [elapsedTimeUnits month] == 1 ? @"" : "s"]) : @""];
Ajoutez plus en changeant l'unité en approprié et à l'extrémité StringFormat contient votre chaîne requise à afficher.
Ce code s'affichera Numérisé il y a 2 ans ou Scanné il y a 5 secondes
NSUInteger desiredComponents = NSYearCalendarUnit | NSMonthCalendarUnit | NSWeekCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit
| NSMinuteCalendarUnit | NSSecondCalendarUnit;
NSDate *date = [formatter dateFromString: @"8 02 2011 14:22:59"];
NSDateComponents *elapsedTimeUnits = [[NSCalendar currentCalendar] components: desiredComponents
fromDate: date
toDate: [NSDate date]
options:0];
// format to be used to generate string to display
NSString *scannedFormat = @"Scanned %d %@ ago";
NSInteger number = 0;
NSString *unit;
if ([elapsedTimeUnits year] > 0) {
number = [elapsedTimeUnits year];
unit = [NSString stringWithFormat:@"year"];
}
else if ([elapsedTimeUnits month] > 0) {
number = [elapsedTimeUnits month];
unit = [NSString stringWithFormat:@"month"];
}
else if ([elapsedTimeUnits week] > 0) {
number = [elapsedTimeUnits week];
unit = [NSString stringWithFormat:@"week"];
}
else if ([elapsedTimeUnits day] > 0) {
number = [elapsedTimeUnits day];
unit = [NSString stringWithFormat:@"day"];
}
else if ([elapsedTimeUnits hour] > 0) {
number = [elapsedTimeUnits hour];
unit = [NSString stringWithFormat:@"hour"];
}
else if ([elapsedTimeUnits minute] > 0) {
number = [elapsedTimeUnits minute];
unit = [NSString stringWithFormat:@"minute"];
}
else if ([elapsedTimeUnits second] > 0) {
number = [elapsedTimeUnits second];
unit = [NSString stringWithFormat:@"second"];
}
// check if unit number is greater then append s at the end
if (number > 1) {
unit = [NSString stringWithFormat:@"%@s", unit];
}
// resultant string required
NSString *scannedString = [NSString stringWithFormat:scannedFormat, number, unit];
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow