2012-09-05 18 views
1

更新:我能够从服务器获取JSON转换的日期2012/09/05 10:45混淆NSDateFormatter

NSDateFormatter *df = [[NSDateFormatter alloc] init]; 
    [df setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 

NSDateFormatter *df = [[NSDateFormatter alloc] init]; 
     [df setDateFormat:@"YYYY-MM-dd HH:mm:ss"]; 


    for (NSString *slotKey in myslots.allKeys) { 
     NSDictionary *slot = [myslots valueForKey:slotKey]; 

     for (myDays in slot){ 

      if ([[self.myDays objectForKey:@"isReservable"] isEqualToNumber:[NSNumber numberWithInt:1]]){ 

       NSDate *newDate = [df dateFromString:[self.myDays objectForKey:@"begin"]]; 
       if (newDate){ 
        [self.timesArray addObject:newDate]; 

       } 
       NSLog(@"these are the returned newdates: %@",newDate); 
       NSLog(@"This is the timesArray: %@", self.timesArray); 
      } 


     }   
    } 

我的这些的NSLog仍然返回null,我这是timesArray是() 我不明白什么是错的。谢谢您的帮助。

+0

没有被添加到的NSArray因为日期格式是barfing上你的输入并且给你nil而不是NSDate。看到我更新的答案。 – Clay

回答

2

确定您的输入有效吗?

此外,您的第一个日志只表示日期格式化程序已分配 - 而不是它会产生输入结果。

快速测试,它看起来像你的问题是在日期的时区部分。下面的代码将返回:date is 2012-10-04 16:15:00 +0000

NSDateFormatter *df = [[NSDateFormatter alloc] init]; 
[df setDateFormat:@"YYYY-MM-dd HH:mm:ss V"]; 
NSDate* date = [df dateFromString:@"2012-10-04 09:15:00 PT"]; 
NSLog(@"date is %@", date); 

您可以检查明确地看到,如果日期格式可以从你的字符串这样的日期:由于日期字符串是从服务器 - 未来

__autoreleasing NSDate* date2 = nil; 
    NSRange dateRange = NSMakeRange(0, [@"2012-10-04 09:15:00 PT" length]); 
    __autoreleasing NSError* err = nil; 

    BOOL canMakeDate = [df getObjectValue:&date2 forString:@"2012-10-04 09:15:00 PT" range:&dateRange error:&err]; 
    NSLog(@"could get a date %@, from range %@. Got %@", canMakeDate ? @"YES" : @"NO", NSStringFromRange(dateRange), date2); 

我会建议调查它是如何发送时间区域并在您的最终手动更改它们。不漂亮,但正则表达式是你的朋友。

+0

我认为他们是,我将如何检查以确保? – TIDev

+0

Unicode规范可用[这里](http://unicode.org/reports/tr35/tr35-10.html#Time_Zone_Fallback) – Clay

+0

请看看更新后的帖子 – TIDev

0

dateFromString:返回nil当它无法将字符串转换为日期。您的V格式与通用非地址格式的时区相匹配,例如Pacific Time的“PT”。你提供的描述时区的内容是完全不同的,因此对格式化程序来说是乱码。

我相信这是一个格式NSTimezone了解,这样你就可以提取字符串,创建一个NSTimezone,用它来获得与UTC的偏移量,然后用“-0700”取代“美国/洛杉矶”或“ -0800“,然后使用”Z“格式说明符将其解析出来。请参阅。

+0

是否这样?NSDateFormatter * df = [[NSDateFormatter alloc] init]; [df setDateFormat:@“YYYY-MM-dd HH:mm:ss V”]; [df setTimeZone:[NSTimeZone systemTimeZone]]; – TIDev

+0

否。服务器发送的时区不太可能是您的系统时区。设置格式化程序时区只是在日期字符串本身没有的情况下提供默认的TZ信息。 –

+0

我也发现了这一点:NSTimezone:请注意,严格来说,诸如“America/Los_Angeles”之类的时区数据库条目不是名称。时区名称的例子是“太平洋夏令时”。虽然许多NSTimeZone方法名称包含单词“name”,但它们引用了ID。 – TIDev

0

需要注意的一件事是在日期格式中使用YYYYYYYYyyyy不一样。

YYYY =年(在“基于年的周”基于日历)。今年指定用于ISO 8601定义的ISO年历日历,但可用于需要星期处理的非格里历日历系统。可能并不总是与历年相同的价值。

yyyy =以格式2012(格里高利)返回年份。

您还指定你的时区会在很短的格式V(PT),请尝试使用长格式VVVV美国(洛杉矶)

+0

在尝试解决方案时仍为null – TIDev