Как отформатировать даты Facebook/Twitter (из канала JSON) в Objective-C
Для моего приложения iPhone...
Я ищу способ форматирования значения свойства created_time
JSON для Facebook.
"created_time": "2010-12-01T21:35:43+0000"
Я также ищу способ отформатировать дату Twitter.
"created_at": "Wed Dec 01 17:08:03 +0000 2010"
Я хочу изменить оба формата в формате Thu Nov 18, 2010 06:48 AM
или что-то подобное. Мне не повезло с помощью NSDateFormatter
.
Как я могу отформатировать эти даты из Facebook и Twitter с помощью Objective-C в желаемый формат?
Ответы
Ответ 1
вот что я работаю для 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 (в виде таблицы), а TWITTER_CREATED_AT_JSON_KEY
является константой NSString
со значением created_at
. используйте датуStr, где бы вы ни отображали дату
и 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];
Ответ 2
Я даю вам решение проанализировать время авиалинии Facebook:
parser = [[NSDateFormatter alloc] init];
[parser setTimeStyle:NSDateFormatterFullStyle];
[parser setFormatterBehavior:NSDateFormatterBehavior10_4];
[parser setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssz"];
Наслаждайтесь!
eBuildy, французское веб-агентство
Ответ 3
@binnyb answer идеально подходит для Objective-C; для тех, кто хочет сделать то же самое с помощью Swift, здесь переведенная версия его ответа:
Дата Twitter:
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!)
В Facebook Дата:
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!)
где twitterDateString
и facebookDateString
- строки даты, полученные из их соответствующих API.
Ответ 4
"created_at" = "Sat Apr 05 06:31:57 +0000 2014";
Возврат к следующему методу Сколько раз до twit aris.
-(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
}
Ответ 5
нечто подобное этому должно сделать первое для вас. я бы дважды проверял документы, так как я мог загладить неправильные буквы.
[dateFormatter setDateFormat:@"YYYY-MM-ddThh:mm:ss z"];
NSDate *date=[NSDateFormatter dateFromString:twitterDate];
Ответ 6
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];
Ответ 7
Чтобы немного усложнить ситуацию, ответ JSON Twitter Search API в настоящее время возвращает формат даты (унаследованный от Summize), который является чем-то как:
@"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"];
Ответ 8
Переведено в 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
}