Dates are represented in Cocoa using the NSDate
class. There is a convenient method implemented in NSDate
to obtain the delta in seconds between two date instances, timeIntervalSinceDate:
. This is called upon an NSDate
instance, taking another NSDate
object as an argument. It returns an NSTimeInterval
(which is a typedef for a double), which is representative of the number of seconds between the two dates.
Given this, it would be fairly simple to adapt the code you have given above to an Objective-C/Cocoa context. Since the delta calculated by NSDate
is given in seconds, given two dates, you could easily adapt the code above:
//Constants
#define SECOND 1
#define MINUTE (60 * SECOND)
#define HOUR (60 * MINUTE)
#define DAY (24 * HOUR)
#define MONTH (30 * DAY)
- (NSString*)timeIntervalWithStartDate:(NSDate*)d1 withEndDate:(NSDate*)d2
{
//Calculate the delta in seconds between the two dates
NSTimeInterval delta = [d2 timeIntervalSinceDate:d1];
if (delta < 1 * MINUTE)
{
return delta == 1 ? @"one second ago" : [NSString stringWithFormat:@"%d seconds ago", (int)delta];
}
if (delta < 2 * MINUTE)
{
return @"a minute ago";
}
if (delta < 45 * MINUTE)
{
int minutes = floor((double)delta/MINUTE);
return [NSString stringWithFormat:@"%d minutes ago", minutes];
}
if (delta < 90 * MINUTE)
{
return @"an hour ago";
}
if (delta < 24 * HOUR)
{
int hours = floor((double)delta/HOUR);
return [NSString stringWithFormat:@"%d hours ago", hours];
}
if (delta < 48 * HOUR)
{
return @"yesterday";
}
if (delta < 30 * DAY)
{
int days = floor((double)delta/DAY);
return [NSString stringWithFormat:@"%d days ago", days];
}
if (delta < 12 * MONTH)
{
int months = floor((double)delta/MONTH);
return months <= 1 ? @"one month ago" : [NSString stringWithFormat:@"%d months ago", months];
}
else
{
int years = floor((double)delta/MONTH/12.0);
return years <= 1 ? @"one year ago" : [NSString stringWithFormat:@"%d years ago", years];
}
}
This would then be called, passing the start and end NSDate
objects as arguments, and would return an NSString
with the time interval.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…