Iphone 关于NSDateFormatter的困惑
更新:我能够将日期从服务器json转换为2012/09/05 10:45Iphone 关于NSDateFormatter的困惑,iphone,ios,nsdate,nsdateformatter,ios5.1,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"];
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 timesArray 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);
由于日期字符串来自服务器端,我建议您调查它是如何发送时区的,并在您端手动更改它们。不漂亮,但regex是您的朋友。
dateFromString:
在无法将字符串转换为日期时返回nil
。您的V
格式匹配通用非位置格式的时区,如太平洋时间的“PT”。您提供的描述时区的内容完全不同,因此对格式化程序来说是胡言乱语
我相信这是一种NSTimezone
可以理解的格式,因此您可以提取字符串,创建NSTimezone
,使用该格式获取UTC的偏移量,然后根据需要将“America/Los_Angeles”替换为“-0700”或“-0800”,然后使用“Z”格式说明符将其解析出来
有关日期格式的详细信息,请参阅。在日期格式中使用
YYYY
,这是需要注意的一件事YYYY
与yyy
不同
YYYY
=年(在基于“一年中的一周”的日历中)。该年名称用于ISO 8601定义的ISO年-周日历,但可用于需要周日期处理的非公历日历系统。可能并不总是与日历年的值相同
yyyy
=以2012年(公历)格式返回年份
您还指定您的时区将采用短格式
V
(PT),请尝试使用长格式vvv
美国(洛杉矶)我想是的,我如何检查以确保?Unicode规范可用我会将self.myDays objectForKey放在2012-10-04 09:15:00 PT所在的位置?没有向NSArray添加任何内容,因为日期格式化程序正在对您的输入进行格式化,并给您零而不是返回NSDate。看看我更新的答案,像这样?NSDateFormatter*df=[[NSDateFormatter alloc]init];[df setDateFormat:@“YYYY-MM-dd HH:MM:ss V”];[df setTimeZone:[NSTimeZone systemTimeZone]];否。服务器发送的时区不太可能是您的系统时区。设置格式化程序时区只是在日期字符串本身不提供默认TZ信息的情况下提供默认TZ信息。我也发现了这一点:NSTimezone:请注意,严格来说,时区数据库条目(如“America/Los_Angeles”)不是ID名称。时区名称的一个示例是“太平洋夏令时”。尽管许多NSTimeZone方法名称包含单词“name”,但它们引用的是ID。这就是为什么NSTimeZone是您想要的。它可以将这些ID转换为UTC的偏移量,也可以转换为专有名称。尝试解决方案时仍然为空