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 而我的 This is the timesArray is () 我不明白出了什么问题。谢谢您的帮助。

4

3 回答 3

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

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

于 2012-09-05T15:12:17.413 回答
0

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

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

有关日期格式的更多信息,请参阅ICU 用户指南部分

于 2012-09-05T16:13:42.373 回答
0

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

YYYY= 年(在基于“一年中的一周”的日历中)。此年份名称用于 ISO 8601 定义的 ISO 年-周日历,但可用于需要处理周日期的非公历日历系统中。可能并不总是与日历年相同。

yyyy= 以 2012(公历)格式返回年份。

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

于 2012-09-05T16:26:45.587 回答