更新:我能够将日期从服务器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是() 我不明白什么是错的。谢谢你的帮助。
答案 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)
要注意的一件事是在日期格式中使用YYYY
。 YYYY
与yyyy
不同。
YYYY
=年份(以“年度周”为基础的日历)。今年的指定用于ISO 8601定义的ISO年 - 周日历,但可用于需要周日处理的非基于格里高利的日历系统。可能并不总是与日历年相同的值。
yyyy
=以2012格式(格里高利)格式返回年份。
您还指定TimeZone采用短格式V
(PT),尝试使用长格式VVVV
美国(洛杉矶)