Als Alternative können Sie den Fehler anfällig Kalender Arithmetik vermeiden auf den Kalenderkomponenten, indem sie sich aus einer Differenz zwischen zwei Daten ziehen können :
NSDate *nowDate = [[NSDate alloc] init];
NSDate *targetDate = nil; // some other date here of your choosing, obviously nil isn't going to get you very far
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSUInteger unitFlags = NSMonthCalendarUnit | NSWeekCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit;
NSDateComponents *components = [gregorian components:unitFlags
fromDate:dateTime
toDate:nowDate options:0];
NSInteger months = [components month];
NSInteger weeks = [components week];
NSInteger days = [components day];
NSInteger hours = [components hour];
NSInteger minutes = [components minute];
der Schlüssel ist die Einrichtung der Einheit Flaggen - das Sie, welche Zeiteinheiten festlegen können Sie das Datum/Zeit wollen in aufgeschlüsselt werden. Wenn Sie nur Stunden brauchen, würden Sie NSHourCalendarUnit einstellen, und dieser Wert wird immer weiter ansteigen, wenn sich Ihre Daten weiter auseinander bewegen, weil es keine größere Einheit gibt, mit der inkrementiert werden könnte.
Sobald Sie Ihre Komponenten haben, können Sie mit der Logik Ihrer Wahl fortfahren, vielleicht indem Sie den bedingten Ablauf von @ alex modifizieren. Diese
ist, was ich warf zusammen:
if (months > 1) {
// Simple date/time
if (weeks >3) {
// Almost another month - fuzzy
months++;
}
return [NSString stringWithFormat:@"%ld months ago", (long)months];
}
else if (months == 1) {
if (weeks > 3) {
months++;
// Almost 2 months
return [NSString stringWithFormat:@"%ld months ago", (long)months];
}
// approx 1 month
return [NSString stringWithFormat:@"1 month ago"];
}
// Weeks
else if (weeks > 1) {
if (days > 6) {
// Almost another month - fuzzy
weeks++;
}
return [NSString stringWithFormat:@"%ld weeks ago", (long)weeks];
}
else if (weeks == 1 ||
days > 6) {
if (days > 6) {
weeks++;
// Almost 2 weeks
return [NSString stringWithFormat:@"%ld weeks ago", (long)weeks];
}
return [NSString stringWithFormat:@"1 week ago"];
}
// Days
else if (days > 1) {
if (hours > 20) {
days++;
}
return [NSString stringWithFormat:@"%ld days ago", (long)days];
}
else if (days == 1) {
if (hours > 20) {
days++;
return [NSString stringWithFormat:@"%ld days ago", (long)days];
}
return [NSString stringWithFormat:@"1 day ago"];
}
// Hours
else if (hours > 1) {
if (minutes > 50) {
hours++;
}
return [NSString stringWithFormat:@"%ld hours ago", (long)hours];
}
else if (hours == 1) {
if (minutes > 50) {
hours++;
return [NSString stringWithFormat:@"%ld hours ago", (long)hours];
}
return [NSString stringWithFormat:@"1 hour ago"];
}
// Minutes
else if (minutes > 1) {
return [NSString stringWithFormat:@"%ld minutes ago", (long)minutes];
}
else if (minutes == 1) {
return [NSString stringWithFormat:@"1 minute ago"];
}
else if (minutes < 1) {
return [NSString stringWithFormat:@"Just now"];
}
Das funktioniert wunderbar. Vielen Dank! –
Das einzige Problem bei dieser Implementierung ist, dass nicht zwischen 24 Stunden als Tag und einem Kalendertag unterschieden wird. Wenn ich zum Beispiel 11:00 PM und 2:00 AM vergleiche, sollte der Unterschied "gestern" und nicht "3 Stunden" sein. Sehen Sie sich NSCalendar und seine begleitende NSDateComponents-Klasse an. – retainCount