Подтвердить что ты не робот

Как отформатировать даты 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 в желаемый формат?

4b9b3361

Ответ 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
}