Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to format Facebook/Twitter dates (from the JSON feed) in Objective-C

For my iPhone application...

I am looking for a way to format the Facebook created_time JSON property value.

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

I am also looking for a way to format the Twitter date.

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

I wish to change both to be in the format of Thu Nov 18, 2010 06:48 AM, or something similar. I have had no luck using NSDateFormatter.

How can i format these dates from Facebook and Twitter using Objective-C into the format i desire?

like image 912
james Avatar asked Dec 01 '10 21:12

james


4 Answers

here is what i have working for 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];

where tweets is an NSMutableArray filled with NSDictionary objects, storyIndex being the row int value (in the tableview), and TWITTER_CREATED_AT_JSON_KEY being a constant NSString with value created_at. use the dateStr wherever you wish to display the date

and 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];
like image 188
james Avatar answered Oct 22 '22 07:10

james


I give you the solution to parse Facebook api date time:

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

Enjoy !

eBuildy, french Web Agency

like image 41
Thomas Decaux Avatar answered Oct 22 '22 06:10

Thomas Decaux


@binnyb's answer is perfect for Objective-C; for those looking to do the same thing using Swift, here's a translated version of his answer:

For the Twitter Date:

    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!)

For the Facebook Date:

    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!)

where twitterDateString and facebookDateString are the date strings obtained from their respective APIs.

like image 4
Ruben Martinez Jr. Avatar answered Oct 22 '22 06:10

Ruben Martinez Jr.


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

Following Method Return How many time before 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;
}

May this help lot.

Translated to 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
}
like image 3
Nimit Parekh Avatar answered Oct 22 '22 06:10

Nimit Parekh