我怎样才能格式类似于jquery.timeago库Objective-C中的date?

我有一个在表单元格中显示的项目的饲料,其中的一部分是过去的date/时间戳。

在Objective-C中,我怎样才能以与web上的jquery.timeago插件相同的方式完成它们的格式化?

也就是说,inputdate并输出如下内容:

  • '现在'
  • '2分钟前'
  • '24天前'
  • '一个月前'

我看到有一个NSDate扩展类在这里与dateWithDaysBeforeNow,dateWithMinutesBeforeNow等方法,但如果有一个库已经这样做,我会用它。

编辑:此外,如果有人编写了一个方法(采取date,返回一个string),完成这一点,无论是这个链接的扩展库或其他方法,我会给他们的答案。

编辑2赏金去任何人都可以在Objective-C中编写模糊datealgorithm。

创build静态类方法:

+ (NSString *)stringForTimeIntervalSinceCreated:(NSDate *)dateTime serverTime:(NSDate *)serverDateTime{ NSInteger MinInterval; NSInteger HourInterval; NSInteger DayInterval; NSInteger DayModules; NSInteger interval = abs((NSInteger)[dateTime timeIntervalSinceDate:serverDateTime]); if(interval >= 86400) { DayInterval = interval/86400; DayModules = interval%86400; if(DayModules!=0) { if(DayModules>=3600){ //HourInterval=DayModules/3600; return [NSString stringWithFormat:@"%i days", DayInterval]; } else { if(DayModules>=60){ //MinInterval=DayModules/60; return [NSString stringWithFormat:@"%i days", DayInterval]; } else { return [NSString stringWithFormat:@"%i days", DayInterval]; } } } else { return [NSString stringWithFormat:@"%i days", DayInterval]; } } else{ if(interval>=3600) { HourInterval= interval/3600; return [NSString stringWithFormat:@"%i hours", HourInterval]; } else if(interval>=60){ MinInterval = interval/60; return [NSString stringWithFormat:@"%i minutes", MinInterval]; } else{ return [NSString stringWithFormat:@"%i Sec", interval]; } } } 

好,我昨晚睡不着 – 猜想我会咬人的。 下面是jQuery timeAgo的一行代码行,注释中包含原始JavaScript源代码以供参考。 使用标准的ObjC / AppKit机制进行用户默认和本地化。 与networking相关的东西,比如更新现有的DOM元素显然被省略了。 也省略了可以在设置中放置函数的机制,因为这是JavaScript的特定types。 无需再费周折:

头文件:

 // // NSDate+JQTimeAgoAdditions.h // JQTimeAgo // #import <Foundation/Foundation.h> @interface NSDate (JQTimeAgoAdditions) - (NSString*)timeAgo; @end extern NSString* const kJQTimeAgoAllowFutureKey; extern NSString* const kJQTimeAgoStringsPrefixAgoKey; extern NSString* const kJQTimeAgoStringsPrefixFromNowKey; extern NSString* const kJQTimeAgoStringsSuffixAgoKey; extern NSString* const kJQTimeAgoStringsSuffixFromNowKey; extern NSString* const kJQTimeAgoStringsSecondsKey; extern NSString* const kJQTimeAgoStringsMinuteKey; extern NSString* const kJQTimeAgoStringsMinutesKey; extern NSString* const kJQTimeAgoStringsHourKey; extern NSString* const kJQTimeAgoStringsHoursKey; extern NSString* const kJQTimeAgoStringsDayKey; extern NSString* const kJQTimeAgoStringsDaysKey; extern NSString* const kJQTimeAgoStringsMonthKey; extern NSString* const kJQTimeAgoStringsMonthsKey; extern NSString* const kJQTimeAgoStringsYearKey; extern NSString* const kJQTimeAgoStringsYearsKey; extern NSString* const kJQTimeAgoStringsNumbersKey; 

并执行文件:

 // // NSDate+JQTimeAgoAdditions.m // JQTimeAgo // #import "NSDate+JQTimeAgoAdditions.h" @implementation NSDate (JQTimeAgoAdditions) - (NSString*)timeAgo { NSTimeInterval distanceMillis = -1000.0 * [self timeIntervalSinceNow]; // inWords: function(distanceMillis) { // var $l = this.settings.strings; NSUserDefaults* defs = [NSUserDefaults standardUserDefaults]; // var prefix = $l.prefixAgo; NSString* prefix = [defs stringForKey: kJQTimeAgoStringsPrefixAgoKey]; // var suffix = $l.suffixAgo; NSString* suffix = [defs stringForKey: kJQTimeAgoStringsSuffixAgoKey]; // if (this.settings.allowFuture) { if ([defs boolForKey: kJQTimeAgoAllowFutureKey]) { // if (distanceMillis < 0) { if (distanceMillis < 0.0) { // prefix = $l.prefixFromNow; prefix = [defs stringForKey: kJQTimeAgoStringsPrefixFromNowKey]; // suffix = $l.suffixFromNow; suffix = [defs stringForKey: kJQTimeAgoStringsSuffixFromNowKey]; // } } // distanceMillis = Math.abs(distanceMillis); distanceMillis = fabs(distanceMillis); // } } // // var seconds = distanceMillis / 1000; const double seconds = distanceMillis / 1000.0; // var minutes = seconds / 60; const double minutes = seconds / 60.0; // var hours = minutes / 60; const double hours = minutes / 60.0; // var days = hours / 24; const double days = hours / 24.0; // var years = days / 365; const double years = days / 365.0; // // function substitute(stringOrFunction, number) { ... } // Use stringWithFormat, etc. // // var words = seconds < 45 && substitute($l.seconds, Math.round(seconds)) || NSString* words = nil; if (seconds < 45) words = [[defs stringForKey: kJQTimeAgoStringsSecondsKey] stringByReplacingOccurrencesOfString: @"%d" withString: [NSString stringWithFormat: @"%d", (int)round(seconds)]]; // seconds < 90 && substitute($l.minute, 1) || else if (seconds < 90) words = [[defs stringForKey: kJQTimeAgoStringsMinuteKey] stringByReplacingOccurrencesOfString: @"%d" withString: [NSString stringWithFormat: @"%d", (int)1]]; // minutes < 45 && substitute($l.minutes, Math.round(minutes)) || else if (minutes < 45) words = [[defs stringForKey: kJQTimeAgoStringsMinutesKey] stringByReplacingOccurrencesOfString: @"%d" withString: [NSString stringWithFormat: @"%d", (int)round(minutes)]]; // minutes < 90 && substitute($l.hour, 1) || else if (minutes < 90) words = [[defs stringForKey: kJQTimeAgoStringsHourKey] stringByReplacingOccurrencesOfString: @"%d" withString: [NSString stringWithFormat: @"%d", (int)1]]; // hours < 24 && substitute($l.hours, Math.round(hours)) || else if (hours < 24) words = [[defs stringForKey: kJQTimeAgoStringsHoursKey] stringByReplacingOccurrencesOfString: @"%d" withString: [NSString stringWithFormat: @"%d", (int)round(hours)]]; // hours < 48 && substitute($l.day, 1) || else if (hours < 48) words = [[defs stringForKey: kJQTimeAgoStringsDayKey] stringByReplacingOccurrencesOfString: @"%d" withString: [NSString stringWithFormat: @"%d", (int)1]]; // days < 30 && substitute($l.days, Math.floor(days)) || else if (days < 30) words = [[defs stringForKey: kJQTimeAgoStringsDaysKey] stringByReplacingOccurrencesOfString: @"%d" withString: [NSString stringWithFormat: @"%d", (int)floor(days)]]; // days < 60 && substitute($l.month, 1) || else if (days < 60) words = [[defs stringForKey: kJQTimeAgoStringsMonthKey] stringByReplacingOccurrencesOfString: @"%d" withString: [NSString stringWithFormat: @"%d", (int)1]]; // days < 365 && substitute($l.months, Math.floor(days / 30)) || else if (days < 365) words = [[defs stringForKey: kJQTimeAgoStringsMonthsKey] stringByReplacingOccurrencesOfString: @"%d" withString: [NSString stringWithFormat: @"%d", (int)floor(days/30.0)]]; // years < 2 && substitute($l.year, 1) || else if (years < 2) words = [[defs stringForKey: kJQTimeAgoStringsYearKey] stringByReplacingOccurrencesOfString: @"%d" withString: [NSString stringWithFormat: @"%d", (int)1]]; // substitute($l.years, Math.floor(years)); else words = [[defs stringForKey: kJQTimeAgoStringsYearsKey] stringByReplacingOccurrencesOfString: @"%d" withString: [NSString stringWithFormat: @"%d", (int)floor(years)]]; // // return $.trim([prefix, words, suffix].join(" ")); NSString* retVal = [[NSString stringWithFormat: @"%@ %@ %@", (prefix ? prefix : @""), (words ? words : @""), (suffix ? suffix : @"")] stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]]; return retVal; // }, } // Load settings + (void)load { // Frameworks are guaranteed to be loaded by now so we can use NSDictionary, etc... // See here for details: http://www.mikeash.com/pyblog/friday-qa-2009-05-22-objective-c-class-loading-and-initialization.html static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ @autoreleasepool { NSDictionary* settings = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool: NO], kJQTimeAgoAllowFutureKey, NSLocalizedStringWithDefaultValue(kJQTimeAgoStringsPrefixAgoKey, nil, [NSBundle mainBundle], @" ", @"kJQTimeAgoStringsPrefixAgoKey"), kJQTimeAgoStringsPrefixAgoKey, NSLocalizedStringWithDefaultValue(kJQTimeAgoStringsPrefixFromNowKey, nil, [NSBundle mainBundle], @" ", @"kJQTimeAgoStringsPrefixFromNowKey"), kJQTimeAgoStringsPrefixFromNowKey, NSLocalizedStringWithDefaultValue(kJQTimeAgoStringsSuffixAgoKey, nil, [NSBundle mainBundle], @"ago", @"kJQTimeAgoStringsSuffixAgoKey"), kJQTimeAgoStringsSuffixAgoKey, NSLocalizedStringWithDefaultValue(kJQTimeAgoStringsSuffixFromNowKey, nil, [NSBundle mainBundle], @"from now", @"kJQTimeAgoStringsSuffixFromNowKey"), kJQTimeAgoStringsSuffixFromNowKey, NSLocalizedStringWithDefaultValue(kJQTimeAgoStringsSecondsKey, nil, [NSBundle mainBundle], @"less than a minute", @"kJQTimeAgoStringsSecondsKey"), kJQTimeAgoStringsSecondsKey, NSLocalizedStringWithDefaultValue(kJQTimeAgoStringsMinuteKey, nil, [NSBundle mainBundle], @"about a minute", @"kJQTimeAgoStringsMinuteKey"), kJQTimeAgoStringsMinuteKey, NSLocalizedStringWithDefaultValue(kJQTimeAgoStringsMinutesKey, nil, [NSBundle mainBundle], @"%d minutes", @"kJQTimeAgoStringsMinutesKey"), kJQTimeAgoStringsMinutesKey, NSLocalizedStringWithDefaultValue(kJQTimeAgoStringsHourKey, nil, [NSBundle mainBundle], @"about an hour", @"kJQTimeAgoStringsHourKey"), kJQTimeAgoStringsHourKey, NSLocalizedStringWithDefaultValue(kJQTimeAgoStringsHoursKey, nil, [NSBundle mainBundle], @"about %d hours", @"kJQTimeAgoStringsHoursKey"), kJQTimeAgoStringsHoursKey, NSLocalizedStringWithDefaultValue(kJQTimeAgoStringsDayKey, nil, [NSBundle mainBundle], @"about a day", @"kJQTimeAgoStringsDayKey"), kJQTimeAgoStringsDayKey, NSLocalizedStringWithDefaultValue(kJQTimeAgoStringsDaysKey, nil, [NSBundle mainBundle], @"%d days", @"kJQTimeAgoStringsDaysKey"), kJQTimeAgoStringsDaysKey, NSLocalizedStringWithDefaultValue(kJQTimeAgoStringsMonthKey, nil, [NSBundle mainBundle], @"about a month", @"kJQTimeAgoStringsMonthKey"), kJQTimeAgoStringsMonthKey, NSLocalizedStringWithDefaultValue(kJQTimeAgoStringsMonthsKey, nil, [NSBundle mainBundle], @"%d months", @"kJQTimeAgoStringsMonthsKey"), kJQTimeAgoStringsMonthsKey, NSLocalizedStringWithDefaultValue(kJQTimeAgoStringsYearKey, nil, [NSBundle mainBundle], @"about a year", @"kJQTimeAgoStringsYearKey"), kJQTimeAgoStringsYearKey, NSLocalizedStringWithDefaultValue(kJQTimeAgoStringsYearsKey, nil, [NSBundle mainBundle], @"%d years", @"kJQTimeAgoStringsYearsKey"), kJQTimeAgoStringsYearsKey, nil]; [[NSUserDefaults standardUserDefaults] registerDefaults: settings]; } }); } @end NSString* const kJQTimeAgoAllowFutureKey = @"kJQTimeAgoAllowFutureKey"; NSString* const kJQTimeAgoStringsPrefixAgoKey = @"kJQTimeAgoStringsPrefixAgoKey"; NSString* const kJQTimeAgoStringsPrefixFromNowKey = @"kJQTimeAgoStringsPrefixFromNowKey"; NSString* const kJQTimeAgoStringsSuffixAgoKey = @"kJQTimeAgoStringsSuffixAgoKey"; NSString* const kJQTimeAgoStringsSuffixFromNowKey = @"kJQTimeAgoStringsSuffixFromNowKey"; NSString* const kJQTimeAgoStringsSecondsKey = @"kJQTimeAgoStringsSecondsKey"; NSString* const kJQTimeAgoStringsMinuteKey = @"kJQTimeAgoStringsMinuteKey"; NSString* const kJQTimeAgoStringsMinutesKey = @"kJQTimeAgoStringsMinutesKey"; NSString* const kJQTimeAgoStringsHourKey = @"kJQTimeAgoStringsHourKey"; NSString* const kJQTimeAgoStringsHoursKey = @"kJQTimeAgoStringsHoursKey"; NSString* const kJQTimeAgoStringsDayKey = @"kJQTimeAgoStringsDayKey"; NSString* const kJQTimeAgoStringsDaysKey = @"kJQTimeAgoStringsDaysKey"; NSString* const kJQTimeAgoStringsMonthKey = @"kJQTimeAgoStringsMonthKey"; NSString* const kJQTimeAgoStringsMonthsKey = @"kJQTimeAgoStringsMonthsKey"; NSString* const kJQTimeAgoStringsYearKey = @"kJQTimeAgoStringsYearKey"; NSString* const kJQTimeAgoStringsYearsKey = @"kJQTimeAgoStringsYearsKey"; NSString* const kJQTimeAgoStringsNumbersKey = @"kJQTimeAgoStringsNumbersKey"; 

我写了一个NSDate类别,它以人类可读的格式(例如“4周,2天”)返回时间增量。 你可以在这里下载它并根据你的需要调整它: https : //github.com/chriscdn/RHTools (寻找NSDate + timesince)。

你可以尝试使用NSDateFormater并自己写。

如果价值在一分钟之内,那么就写下来,否则分钟,小时,天等

我知道这是旧的,但这是我所做的相当简单…

 NSDate *placeDate = [object createdAt]; NSTimeInterval timeSince = [placeDate timeIntervalSinceNow]; NSLog(@"%f", timeSince); if (timeSince > -60) { cell.date.text = [NSString stringWithFormat:@"%f seconds ago", -timeSince]; } else if (timeSince <= -60 && timeSince > -3600){ cell.date.text = [NSString stringWithFormat:@"%.0f minutes ago", -timeSince/60]; } else if (timeSince <= -3600 && timeSince > -86400){ cell.date.text = [NSString stringWithFormat:@"%.0f hours ago", -timeSince/60/60]; } else if (timeSince <= -86400 && timeSince > -604800){ cell.date.text = [NSString stringWithFormat:@"%.0f days ago", -timeSince/24/60/60]; } else if (timeSince <= -604800 && timeSince > -2592000){ cell.date.text = [NSString stringWithFormat:@"%.0f weeks ago", -timeSince/7/24/60/60]; } else if (timeSince <= -2592000 && timeSince > -31536000){ cell.date.text = [NSString stringWithFormat:@"%.0f months ago", -timeSince/30/24/60/60]; } else { cell.date.text = [NSString stringWithFormat:@"%.1f years ago", -timeSince/365/24/60/60]; } 

https://stackoverflow.com/a/8268903/1915957

↑转换swift代码。

 class func stringForTimeIntervalSinceCreated(dateTime :NSDate, serverTime serverDateTime:NSDate) -> String { var MinInterval :Int = 0 var HourInterval :Int = 0 var DayInterval :Int = 0 var DayModules :Int = 0 let interval = abs(Int(dateTime.timeIntervalSinceDate(serverDateTime))) if (interval >= 86400) { DayInterval = interval/86400 DayModules = interval%86400 if (DayModules != 0) { if (DayModules>=3600) { //HourInterval=DayModules/3600; return String(DayInterval) + " days" } else { if (DayModules >= 60) { //MinInterval=DayModules/60; return String(DayInterval) + " days" } else { return String(DayInterval) + " days" } } } else { return String(DayInterval) + " days" } } else { if (interval >= 3600) { HourInterval = interval/3600 return String(HourInterval) + " hours" } else if (interval >= 60) { MinInterval = interval/60 return String(MinInterval) + " minutes" } else { return String(interval) + " Sec" } } } 
 + (NSString *)changeTime:(NSString *)serverDateTime{ NSInteger MinInterval; NSInteger HourInterval; NSInteger DayInterval; //NSInteger DayModules; NSTimeInterval _interval=[serverDateTime doubleValue]; NSDate *Serverdate = [NSDate dateWithTimeIntervalSince1970:_interval]; NSInteger interval = (long)((NSInteger)[[NSDate date] timeIntervalSinceDate:Serverdate]); if(interval >= 86400) { DayInterval = interval/86400;// no. of days if (DayInterval > 14){ return [NSString stringWithFormat:@"w+"]; } if (DayInterval >= 7 && DayInterval <= 14){ int diff = (int)DayInterval / 7; return [NSString stringWithFormat:@"%iw",diff]; } return [NSString stringWithFormat:@"%id",(int)DayInterval]; } else{ if(interval>=3600) { HourInterval= interval/3600; return [NSString stringWithFormat:@"%lih", (long)HourInterval]; } else if(interval>=60){ MinInterval = interval/60; return [NSString stringWithFormat:@"%lim", (long)MinInterval]; } else{ return [NSString stringWithFormat:@"%lis", (long)interval]; } return @"now"; } } 

如果你有date和时间的问题。 你应该考虑到这个图书馆

https://github.com/MatthewYork/DateTools

它总是帮助!

你可以使用NSDate-TimeAgo 。 它可以使用CocoaPods安装在您的项目中。

  1. 将文件添加到您的项目 – 手动或通过Cocoapods(pod'NSDate + TimeAgo')
  2. 使用#import "NSDate+TimeAgo.h"导入标题
  3. 使用库方法timeAgo。