iOS NSDateFormatter dateFromString只在一个实例中返回nil

NSDateFormatter是否有意外返回零的倾向? 我不会这样想的。 我希望我忽略了一些无论什么原因我都看不到的细节。

我有一些数据描述太阳和月亮。 它在下面列出。 我也有一个循环,它遍历这个数据,一旦它从plist加载到字典中。 最后,我有一个类为我使用NSDateFormatter作为单例处理date。 这个过程工作得很好,这些方法已经相互作用并且产生了一两个月的正确date,但是今天却崩溃了。 所有正在创build并通过这个简单过程的string都被正确地转换为date,除了最后一个是nil。 以下是发生的事情:

这是属性列表中的数据。

<key>2014-3-7</key> <dict> <key>moonrise</key> <string>10:51 am</string> <key>moonset</key> <string>0:03 am</string> <key>phase</key> <string>Waxing Crescent</string> <key>sunrise</key> <string>6:39 am</string> <key>sunset</key> <string>6:21 pm</string> </dict> <key>2014-3-8</key> <dict> <key>moonrise</key> <string>11:39 am</string> <key>moonset</key> <string>0:56 am</string> <key>phase</key> <string>First Quarter</string> <key>sunrise</key> <string>6:38 am</string> <key>sunset</key> <string>6:21 pm</string> </dict> <key>2014-3-9</key> <dict> <key>moonrise</key> <string>1:28 pm</string> <key>moonset</key> <string>2:45 am</string> <key>phase</key> <string></string> <key>sunrise</key> <string>7:37 am</string> <key>sunset</key> <string>7:22 pm</string> </dict> 

这个数据通过一个循环来处理,从昨天开始到明天结束的datestring中创builddate,所以在这种情况下,它将在7日或3月开始,9日结束,我们正在使用给定date的每个plist项目中的值作为一个名为iDay的词典。

 NSString *eventString; NSDate *moonrise; NSDate *moonset; NSString *dateFormatString = @"yyyy-MM-dd h:mm a"; if ([iDay objectForKey:@"moonrise"] != nil) { eventString = [NSString stringWithFormat:@"%@ %@", dateString, [iDay objectForKey:@"moonrise"]]; moonrise = [self.dateTime makeDateFromString:eventString format:dateFormatString]; } if ([iDay objectForKey:@"moonset"] != nil) { eventString = [NSString stringWithFormat:@"%@ %@",dateString, [iDay objectForKey:@"moonset"]]; moonset = [self.dateTime makeDateFromString:eventString format:dateFormatString]; } 

这些语句传递给[self.dateTime makeDateFromString]的string如下所示:

2014-3-7 10:51 am

2014-3-7 0:03 am

2014-3-8 11:39 am

2014-3-8 0:56

2014-3-9 1:28 pm

2014-3-9 2:45 am

好的。 现在的date时间单身人士:

 +(ADateTimeClass *) sharedDateTime { @synchronized(self) { if (sharedInstance == NULL) sharedInstance = [[self alloc] init]; } return sharedInstance; } -(id) init{ self = [super init]; if(self){ self.dateFormat = [NSDateFormatter new]; self.dateFormat.timeZone = [NSTimeZone timeZoneWithName:@"UTC"]; } return self; } 

…和一切都可怕的错误的方法。 所有传递给这个方法的string都会像date那样正确返回,除了最后一个,我已经检查过了,nil来自“[dateFormat dateFromString:dateString]”,这里dateString是我上面列出的六个date之一。

 -(NSDate*) makeDateFromString:(NSString *)dateString format:(NSString *)format{ [dateFormat setDateFormat:format]; NSDate* aDate = [dateFormat dateFromString:dateString]; return aDate; } 

结果是:

月出版印刷说明:2014-03-07 14:51:00 +0000

打印moonset的描述:2014-03-07 04:03:00 +0000

月出版印刷说明:2014-03-08 15:39:00 +0000

打印moonset的说明:2014-03-08 04:56:00 +0000

月出的印刷说明:2014-03-09 16:28:00 +0000

打印moonset的描述:<nil> <———— !!!!!! 咦???

这实际上是一个简单的问题,取决于你住在哪里。 至less在美国,从2014年3月9日凌晨2点到凌晨2点59分之间的任何时间都不会因夏时制的变化而存在。 所以这个date是无效的。