【问题标题】:How to format Facebook/Twitter dates (from the JSON feed) in Objective-C如何在 Objective-C 中格式化 Facebook/Twitter 日期(来自 JSON 提要)
【发布时间】:2023-03-28 12:30:01
【问题描述】:

对于我的 iPhone 应用程序...

我正在寻找一种方法来格式化 Facebook created_time JSON 属性值。

"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

如何使用 Objective-C 将 Facebook 和 Twitter 中的这些日期格式化为我想要的格式?

【问题讨论】:

    标签: iphone objective-c ios


    【解决方案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。在您希望显示日期的任何地方使用 dateStr

    和脸书:

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

    【讨论】:

    • Facebook 格式更正:[df setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZZ"];这种格式解决了两个问题 - 1. 注意大写 MM(月份),而不是 mm 2. 稍后调用 dateFromString 时无需将 T 替换为空字符串
    • 对于那些不使用美国或英国语言环境的人来说,这不起作用。您必须将 dateformatter 的语言环境设置为: [dateForm setLocale: [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]];
    • 另一个更正:“ZZZZ”输出“GMT-0000”,而“ZZ”只给你“-0000”
    • 哦.. 非常感谢 :)
    【解决方案2】:

    我给你解析Facebook api日期时间的解决方案:

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

    享受吧!

    eBuildy,法国网站代理

    【讨论】:

      【解决方案3】:

      @binnyb's answer 非常适合 Objective-C;对于那些希望使用 Swift 做同样事情的人,这是他的答案的翻译版本:

      推特日期:

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

      其中twitterDateStringfacebookDateString 是从它们各自的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];
        

        【讨论】:

        • 这不起作用。我也相信您输入的内容有点错误:NSDateFormatter 应该替换为dateFormatter。当我使用此代码格式化上述 Twitter 日期时,我使用 NSString *d = [dateFormatter stringWithDate:date]; 得到一个空字符串
        【解决方案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】:

          为了让事情复杂一点,Twitter Search API 的 JSON 响应当前返回的日期格式(继承自 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(Nimit Parekh 回答)

            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
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-12-10
              相关资源
              最近更新 更多