关于NSDateFormatter的困惑

时间:2012-09-05 15:00:43

标签: iphone ios nsdate nsdateformatter ios5.1

更新:我能够将日期从服务器json转换为2012/09/05 10:45

    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是() 我不明白什么是错的。谢谢你的帮助。

3 个答案:

答案 0 :(得分: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);

由于日期字符串来自服务器端,我建议调查它如何发送时区并在结束时手动更改它们。不漂亮,但正则表达式是你的朋友。

答案 1 :(得分:0)

dateFromString:在无法将字符串转换为日期时返回nil。您的V格式与通用非位置格式的时区匹配,例如太平洋时间的“PT”。您描述时区的内容完全不同,因此格式化程序存在胡言乱语。

我认为这是NSTimezone理解的格式,因此您可以提取字符串,创建NSTimezone,使用它来获取UTC的偏移量,然后替换“America / Los_Angeles”根据需要使用“-0700”或“-0800”,然后使用“Z”格式说明符解析出来。

有关日期格式的更多信息,请参阅ICU User Guide section

答案 2 :(得分:0)

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

YYYY =年份(以“年度周”为基础的日历)。今年的指定用于ISO 8601定义的ISO年 - 周日历,但可用于需要周日处理的非基于格里高利的日历系统。可能并不总是与日历年相同的值。

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

您还指定TimeZone采用短格式V(PT),尝试使用长格式VVVV美国(洛杉矶)