我想在iPhone的Objective-C中编写一种模糊的日期方法来计算日期。这里有一个流行的解释
但是,它包含缺少的参数。如何在Objective-C中使用它?谢谢。
const int SECOND = 1; const int MINUTE = 60 * SECOND; const int HOUR = 60 * MINUTE; const int DAY = 24 * HOUR; const int MONTH = 30 * DAY; if (delta < 1 * MINUTE) { return ts.Seconds == 1 ? "one second ago" : ts.Seconds + " seconds ago"; } if (delta < 2 * MINUTE) { return "a minute ago"; } if (delta < 45 * MINUTE) { return ts.Minutes + " minutes ago"; } if (delta < 90 * MINUTE) { return "an hour ago"; } if (delta < 24 * HOUR) { return ts.Hours + " hours ago"; } if (delta < 48 * HOUR) { return "yesterday"; } if (delta < 30 * DAY) { return ts.Days + " days ago"; } if (delta < 12 * MONTH) { int months = Convert.ToInt32(Math.Floor((double)ts.Days / 30)); return months <= 1 ? "one month ago" : months + " months ago"; } else { int years = Convert.ToInt32(Math.Floor((double)ts.Days / 365)); return years <= 1 ? "one year ago" : years + " years ago"; }
日期使用NSDate类在Cocoa中表示。有一种方便的方法可以实现,NSDate以获取两个日期实例之间的秒差timeIntervalSinceDate:。这是在NSDate实例上调用的,并以另一个NSDate对象作为参数。它返回一个NSTimeInterval(代表double的typedef),它代表两个日期之间的秒数。
NSDate
timeIntervalSinceDate:
NSTimeInterval
鉴于此,将上面给出的代码改编为Objective-C / Cocoa上下文将非常简单。由于计算的差值NSDate以秒为单位,给出了两个日期,因此您可以轻松修改上面的代码:
//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]; } }
然后将其调用,将开始和结束NSDate对象作为参数传递,并将返回NSString带有时间间隔的。
NSString