如何在Objective-C中格式化Facebook / Twitterdate(来自JSON提要)

对于我的iPhone应用程序…

我正在寻找一种方法来格式化Facebook created_time JSON属性值。

"created_time": "2010-12-01T21:35:43+0000"

我也在寻找格式化Twitterdate的方法。

"created_at": "Wed Dec 01 17:08:03 +0000 2010"

我希望改变格式为Thu Nov 18, 2010 06:48 AM ,或类似的东西。 我没有运气使用NSDateFormatter

我如何使用Objective-C将这些date从Facebook和Twitter格式化成我所需要的格式?

这里是我为Twitter工作的内容:

 NSDateFormatter *df = [[[NSDateFormatter alloc] init] autorelease]; //Wed Dec 01 17:08:03 +0000 2010 [df setDateFormat:@"eee MMM dd HH:mm:ss ZZZZ yyyy"]; NSDate *date = [df dateFromString:[[tweets objectAtIndex: storyIndex] objectForKey: TWITTER_CREATED_AT_JSON_KEY]]; [df setDateFormat:@"eee MMM dd yyyy"]; NSString *dateStr = [df stringFromDate:date]; 

tweets是一个NSMutableArray填充NSDictionary对象, storyIndex是行int值(在tableview中), TWITTER_CREATED_AT_JSON_KEY是一个常量NSString ,值为created_at 。 在任何你想显示date的地方使用dateStr

和Facebook:

 NSDateFormatter *df = [[[NSDateFormatter alloc] init] autorelease]; //2010-12-01T21:35:43+0000 [df setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZZ"]; NSDate *date = [df dateFromString:[[facebook objectForKey:FACEBOOK_POST_CREATED_TIME_JSON_KEY] stringByReplacingOccurrencesOfString:@"T" withString:@""]]; [df setDateFormat:@"eee MMM dd, yyyy hh:mm"]; NSString *dateStr = [df stringFromDate:date]; 

我给你的解决scheme来parsingFacebook API的date时间:

 parser = [[NSDateFormatter alloc] init]; [parser setTimeStyle:NSDateFormatterFullStyle]; [parser setFormatterBehavior:NSDateFormatterBehavior10_4]; [parser setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssz"]; 

请享用 !

eBuildy,法国networking社

@ binnyb的答案是完美的Objective-C; 对于那些希望使用Swift做同样的事情的人来说,这里是他的答案的翻译版本:

对于Twitterdate:

  var df = NSDateFormatter() //Wed Dec 01 17:08:03 +0000 2010 df.dateFormat = "eee MMM dd HH:mm:ss ZZZZ yyyy" var date = df.dateFromString(twitterDateString) df.dateFormat = "eee MMM dd yyyy" var dateStr = df.stringFromDate(date!) 

对于Facebookdate:

  var df = NSDateFormatter() //Wed Dec 01 17:08:03 +0000 2010 df.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZ" var date = df.dateFromString(facebookDateString) df.dateFormat = "eee MMM dd yyyy" var dateStr = df.stringFromDate(date!) 

其中twitterDateStringfacebookDateString是从各自的API获取的datestring。

 "created_at" = "Sat Apr 05 06:31:57 +0000 2014"; 

以下方法返回之前多less时间twit起来。

 -(NSString*)retrivePostTime:(NSString*)postDate{ NSDateFormatter *df = [[NSDateFormatter alloc] init]; [df setDateFormat:@"eee MMM dd HH:mm:ss ZZZZ yyyy"]; NSDate *userPostDate = [df dateFromString:postDate]; NSDate *currentDate = [NSDate date]; NSTimeInterval distanceBetweenDates = [currentDate timeIntervalSinceDate:userPostDate]; NSTimeInterval theTimeInterval = distanceBetweenDates; // Get the system calendar NSCalendar *sysCalendar = [NSCalendar currentCalendar]; // Create the NSDates NSDate *date1 = [[NSDate alloc] init]; NSDate *date2 = [[NSDate alloc] initWithTimeInterval:theTimeInterval sinceDate:date1]; // Get conversion to months, days, hours, minutes unsigned int unitFlags = NSHourCalendarUnit | NSMinuteCalendarUnit | NSDayCalendarUnit | NSMonthCalendarUnit | NSSecondCalendarUnit; NSDateComponents *conversionInfo = [sysCalendar components:unitFlags fromDate:date1 toDate:date2 options:0]; NSString *returnDate; if ([conversionInfo month] > 0) { returnDate = [NSString stringWithFormat:@"%ldmth ago",(long)[conversionInfo month]]; }else if ([conversionInfo day] > 0){ returnDate = [NSString stringWithFormat:@"%ldd ago",(long)[conversionInfo day]]; }else if ([conversionInfo hour]>0){ returnDate = [NSString stringWithFormat:@"%ldh ago",(long)[conversionInfo hour]]; }else if ([conversionInfo minute]>0){ returnDate = [NSString stringWithFormat:@"%ldm ago",(long)[conversionInfo minute]]; }else{ returnDate = [NSString stringWithFormat:@"%lds ago",(long)[conversionInfo second]]; } return returnDate; } 

愿这帮助很多。

翻译成Swift 2

 func retrivePostTime(postDate: String) -> String { let df: NSDateFormatter = NSDateFormatter() df.dateFormat = "eee MMM dd HH:mm:ss ZZZZ yyyy" let userPostdate: NSDate = df.dateFromString(postDate)! let currentDate: NSDate = NSDate() let distanceBetweenDates: NSTimeInterval = currentDate.timeIntervalSinceDate(userPostdate) let theTimeInterval: NSTimeInterval = distanceBetweenDates let sysCalendar: NSCalendar = NSCalendar.currentCalendar() let date1: NSDate = NSDate() let date2: NSDate = NSDate(timeInterval: theTimeInterval, sinceDate: date1) let conversionInfo: NSDateComponents = sysCalendar.components([.Hour, .Minute, .Day, .Month, .Second], fromDate: date1, toDate: date2, options: []) var returnDate: String = "" if conversionInfo.month > 0 { returnDate = String(format: "%ldmth", conversionInfo.month) } else if conversionInfo.day > 0 { returnDate = String(format: "%ldd", conversionInfo.day) } else if conversionInfo.hour > 0 { returnDate = String(format: "%ldh", conversionInfo.hour) } else if conversionInfo.minute > 0 { returnDate = String(format: "%ldm", conversionInfo.minute) } else if conversionInfo.second > 0 { returnDate = String(format: "%lds", conversionInfo.second) } return returnDate } 

类似的东西应该为你做第一个。 我会仔细检查文档,因为我可能已经大写错误的字母。

 [dateFormatter setDateFormat:@"YYYY-MM-ddThh:mm:ss z"]; NSDate *date=[NSDateFormatter dateFromString:twitterDate]; 
 NSString *yourInputFBdate = @"2010-12-02T20:12:06+0000"; NSString *fbDate = [yourInputFBdate stringByReplacingOccurrencesOfString:@"T" withString:@" "]; fbDate = [fbDate stringByReplacingOccurrencesOfString:@"+" withString:@" +"]; NSDate *date = [[NSDate alloc] initWithString:fbDate]; /// do something with date ... [date release]; 

只是为了使事情复杂一点, TwittersearchAPI的JSON响应当前返回一个date格式(从Summizeinheritance),就像这样:

 @"Sun, 05 Jun 2011 12:25:47 +0000" 

要将其转换为NSDate,请使用:

 NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; [dateFormatter setDateFormat:@"eee, dd MMM yyyy HH:mm:ss ZZZZ"]; NSDate *date = [dateFormatter dateFromString:@"Sun, 05 Jun 2011 12:25:47 +0000"]; 

翻译成Swift 2 (Nimit Parekh答案)

 func retrivePostTime(postDate: String) -> String { let df: NSDateFormatter = NSDateFormatter() df.dateFormat = "eee MMM dd HH:mm:ss ZZZZ yyyy" let userPostdate: NSDate = df.dateFromString(postDate)! let currentDate: NSDate = NSDate() let distanceBetweenDates: NSTimeInterval = currentDate.timeIntervalSinceDate(userPostdate) let theTimeInterval: NSTimeInterval = distanceBetweenDates let sysCalendar: NSCalendar = NSCalendar.currentCalendar() let date1: NSDate = NSDate() let date2: NSDate = NSDate(timeInterval: theTimeInterval, sinceDate: date1) let conversionInfo: NSDateComponents = sysCalendar.components([.Hour, .Minute, .Day, .Month, .Second], fromDate: date1, toDate: date2, options: []) var returnDate: String = "" if conversionInfo.month > 0 { returnDate = String(format: "%ldmth", conversionInfo.month) } else if conversionInfo.day > 0 { returnDate = String(format: "%ldd", conversionInfo.day) } else if conversionInfo.hour > 0 { returnDate = String(format: "%ldh", conversionInfo.hour) } else if conversionInfo.minute > 0 { returnDate = String(format: "%ldm", conversionInfo.minute) } else if conversionInfo.second > 0 { returnDate = String(format: "%lds", conversionInfo.second) } return returnDate }