Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

94 lines (67 sloc) 2.696 kB
//
// GitXRelativeDateFormatter.m
// GitX
//
// Created by Nathan Kinsinger on 9/1/10.
// Copyright 2010 Nathan Kinsinger. All rights reserved.
//
#import "GitXRelativeDateFormatter.h"
#define MINUTE 60
#define HOUR (60 * MINUTE)
#define WEEK 7
@implementation GitXRelativeDateFormatter
- (NSString *)stringForObjectValue:(id)date
{
if (![date isKindOfClass:[NSDate class]])
return nil;
NSDate *now = [NSDate date];
NSInteger secondsAgo = lround([now timeIntervalSinceDate:date]);
if (secondsAgo < 0)
return @"In the future!";
if (secondsAgo < MINUTE)
return @"seconds ago";
if (secondsAgo < (2 * MINUTE))
return @"1 minute ago";
if (secondsAgo < HOUR)
return [NSString stringWithFormat:@"%d minutes ago", (secondsAgo / MINUTE)];
if (secondsAgo < (2 * HOUR))
return @"1 hour ago";
// figure out # of days ago based on calender days (so yesterday is the day before today not 24 hours ago)
NSDateFormatter *midnightFormmatter = [[NSDateFormatter alloc] init];
[midnightFormmatter setDateFormat:@"yyyy-MM-dd"];
NSDate *midnightOnTargetDate = [midnightFormmatter dateFromString:[midnightFormmatter stringFromDate:date]];
NSDate *midnightToday = [midnightFormmatter dateFromString:[midnightFormmatter stringFromDate:now]];
// use NSCalendar so it will handle things like leap years correctly
NSDateComponents *components = [[NSCalendar currentCalendar] components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit)
fromDate:midnightOnTargetDate
toDate:midnightToday
options:0];
NSInteger yearsAgo = [components year];
NSInteger monthsAgo = [components month];
NSInteger daysAgo = [components day];
if (yearsAgo == 0) {
if (monthsAgo == 0) {
// return "hours ago" if it's still today, but "Yesterday" only if more than 6 hours ago
// gives people a little time to get used to the idea that yesterday is over :)
if ((daysAgo == 0) || (secondsAgo < (6 * HOUR)))
return [NSString stringWithFormat:@"%d hours ago", (secondsAgo / HOUR)];
if (daysAgo == 1)
return @"Yesterday";
if (daysAgo >= (2 * WEEK))
return [NSString stringWithFormat:@"%d weeks ago", (daysAgo / WEEK)];
return [NSString stringWithFormat:@"%d days ago", daysAgo];
}
if (monthsAgo == 1)
return @"1 month ago";
return [NSString stringWithFormat:@"%d months ago", monthsAgo];
}
if (yearsAgo == 1) {
if (monthsAgo == 0)
return @"1 year ago";
if (monthsAgo == 1)
return @"1 year 1 month ago";
return [NSString stringWithFormat:@"1 year %d months ago", monthsAgo];
}
return [NSString stringWithFormat:@"%d years ago", yearsAgo];
}
@end
Jump to Line
Something went wrong with that request. Please try again.