NSDate格式化问题与Twitter的JSON API

我想格式化JSON响应date值:

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

我遵循这个问题的指示:

iOS中的date/时间分析:如何处理(或不处理)时区?

实际上,JSON响应中的date值是:

 created_at":"Mon, 28 May 2012 11:20:29 +0000" 

当通过[df dateFromString:[twitter objectForKey:@"created_at"]];接收到值时,Datevariables为nil [df dateFromString:[twitter objectForKey:@"created_at"]];

非常感谢

如果月份缩写,请尝试以下格式(9月):

 [df setDateFormat:@"EEE, d MMM y HH:mm:ss Z"];; 

 [df setDateFormat:@"EEE, d MMMM y HH:mm:ss Z"]; 

如果月份名称被写出(9月)。

格式说明符的完整列表。

我也必须改变语言环境

 NSDateFormatter *df = [[NSDateFormatter alloc] init]; [df setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease]]; [df setDateFormat:@"EEE, d MMM y HH:mm:ss Z"]; NSDate *date = [df dateFromString:@"Mon, 28 May 2012 11:20:29 +0000"]; [df setDateFormat:@"dd/MM/yyyy"]; NSString *dateStr = [df stringFromDate:date]; NSLog(@"%@",dateStr); 

产量

 28/05/2012 

我发现twitter Json响应中的“created_at”属性的格式如下:

 Thu Apr 19 10:07:29 +0000 2012 

所以我使用这个格式化程序:

 [df setDateFormat:@"EEE MMM d HH:mm:ss Z y"]; 

它工作正常;)

要validation您使用的格式,请从date创build一个string:

 NSDateFormatter *df = [[NSDateFormatter alloc] init]; [df setDateFormat:@"eee, MMM dd HH:mm:ss ZZZZ yyyy"]; NSLog(@"%@", [df stringFromDate: [NSDate date]]; 

比较这与你的JSON响应的date,你应该能够看到你的格式是错误的。


Swift中

 let df = NSDateFormatter() df.dateFormat = "eee, MMM dd HH:mm:ss ZZZZ yyyy" let dateStr = df.stringFromDate(NSDate()) println("\(dateStr)") 

右格式化程序的值是:

 [df setDateFormat:@"eee, dd MMM yyyy HH:mm:ss ZZZZ"]; 

对于:

 created_at":"Mon, 28 May 2012 11:20:29 +0000" 
 "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; }