【问题标题】:NSDate formatter issue with Twitter JSON APITwitter JSON API 的 NSDate 格式化程序问题
【发布时间】:2012-06-03 02:51:28
【问题描述】:

我正在尝试格式化 JSON 响应日期值:

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

我按照这个问题的说明进行操作:

Date/Time parsing in iOS: how to deal (or not deal) with timezones?

实际上,JSON 响应中的日期值是:

created_at":"Mon, 28 May 2012 11:20:29 +0000"

[df dateFromString:[twitter objectForKey:@"created_at"]];接收值时日期变量为零

非常感谢

【问题讨论】:

    标签: objective-c ios cocoa-touch twitter


    【解决方案1】:

    如果月份是缩写的(Sept),请尝试这种格式:

    [df setDateFormat:@"EEE, d MMM y HH:mm:ss Z"];;
    

    [df setDateFormat:@"EEE, d MMMM y HH:mm:ss Z"];
    

    如果写出月份名称(九月)。

    the full list of format specifiers.

    我还必须更改语言环境

    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
    

    【讨论】:

    • -1 MM 表示用零填充的两位数月份,例如06(六月)或12(十二月)。
    • 我试过了。我遇到了另一个问题,它似乎考虑了语言环境。
    • 在我上次编辑时,格式化程序出现了一些问题。我更正了。
    【解决方案2】:

    我发现twitter Json响应中的“created_at”属性是这种格式:

    Thu Apr 19 10:07:29 +0000 2012
    

    所以我使用了这个格式化程序:

    [df setDateFormat:@"EEE MMM d HH:mm:ss Z y"];
    

    一切正常;)

    【讨论】:

      【解决方案3】:

      要验证您使用的格式,请根据日期创建一个字符串:

      NSDateFormatter *df = [[NSDateFormatter alloc] init];
      [df setDateFormat:@"eee, MMM dd HH:mm:ss ZZZZ yyyy"];
      NSLog(@"%@", [df stringFromDate: [NSDate date]];
      

      将此与您的 JSON 响应中的日期进行比较,您应该能够看到格式错误的地方。


      斯威夫特

      let df = NSDateFormatter()
      df.dateFormat = "eee, MMM dd HH:mm:ss ZZZZ yyyy"
      let dateStr = df.stringFromDate(NSDate())
      println("\(dateStr)")
      

      【讨论】:

      • 第一种格式是正确的:Date formater Mon, May 28 22:35:06 GMT+02:00 2012,所以我理解问题在于它与 Twitter JSON 值不匹配。谢谢
      【解决方案4】:

      正确的格式化程序值为:

      [df setDateFormat:@"eee, dd MMM yyyy HH:mm:ss ZZZZ"];
      

      为:

      created_at":"Mon, 28 May 2012 11:20:29 +0000"
      

      【讨论】:

        【解决方案5】:
        "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;
        }
        

        【讨论】:

          猜你喜欢
          • 2011-06-08
          • 1970-01-01
          • 2011-08-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-10
          • 2011-09-17
          相关资源
          最近更新 更多