Click here for the new  weblog.

Daily Snippet

When writing Twitter clients, RSS reader or email apps - one always needs one thing. A relative date:

-(NSString *)relativeDateStringFromDate:(NSDate *)date {

const int SECOND = 1;
const int MINUTE = 60 * SECOND;
const int HOUR = 60 * MINUTE;
const int DAY = 24 * HOUR;
const int MONTH = 30 * DAY;

NSDate *now = [NSDate date];
NSTimeInterval delta = [date timeIntervalSinceDate:now]* -1.0;

NSCalendar *calendar = [NSCalendar currentCalendar];
NSUInteger units = (NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit);
NSDateComponents *components = [calendar components:units fromDate:date toDate:now options:0];

NSString *relativeString;

if (delta < 0) {
relativeString = @"in the future";

} else if (delta < 1 * MINUTE) {
relativeString = (components.second == 1) ? @"one second ago" : [NSString stringWithFormat:@"%ld seconds ago",components.second];

} else if (delta < 2 * MINUTE) {
relativeString = @"a minute ago";

} else if (delta < 45 * MINUTE) {
relativeString = [NSString stringWithFormat:@"%ld minutes ago",components.minute];

} else if (delta < 90 * MINUTE) {
relativeString = @"an hour ago";

} else if (delta < 24 * HOUR) {
relativeString = [NSString stringWithFormat:@"%ld hours ago",components.hour];

} else if (delta < 48 * HOUR) {
relativeString = @"yesterday";

} else if (delta < 30 * DAY) {
relativeString = [NSString stringWithFormat:@"%ld days ago",components.day];

} else if (delta < 12 * MONTH) {
relativeString = (components.month
} else {
relativeString = (components.year
}

return relativeString;
}

  1. moapp posted this