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; }