NSDate和NSDateFormatter问题

4

我有点难理解为什么以下代码会导致我的应用程序崩溃:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"MMMM d, yyyy"];
NSDate *date = [dateFormatter dateFromString:cDate];
datePicker.date = date;
NSString *dateStr = [dateFormatter stringFromDate:date]; 
[dateLabel setText:dateStr];
[dateFormatter release];

如果我将上面的内容注释掉,应用程序就可以正常运行。如果我将日期格式更改为以下格式,也不会发生崩溃:
[dateFormatter setDateFormat:@"yyyy-MM-dd"];

在我的UIDatePicker代理中,我有重复的代码,如下所示(并且非常有效):
-(IBAction)datePickerValueChanged:(id)sender 
{
    NSDate *date = [datePicker date];       
    NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
    [dateFormatter setDateFormat:@"MMMM d, yyyy"];
    NSString *dateStr = [dateFormatter stringFromDate:date]; 
    [dateLabel setText:dateStr]; 
}

我收到的错误信息如下:
*** Assertion failure in -[UIDatePickerView _updateBitsForDate:andReload:animateIfNeeded:], /SourceCache/UIKit/UIKit-747.38/UIDatePicker.m:892

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid parameter not satisfying: date'

对于未来遇到此问题的人:当传递给 setDate:setDate:animated:NSDate 实例实际上是 nil 时,会抛出该断言。 - Dave DeLong
2个回答

3
问题在于输入的日期格式为"yyyy-MM-dd",但是你正在使用与dateFromString格式化为"MMMM d, yyyy"的日期格式化程序。如果想要接受这两种格式,你需要尝试使用这两种格式进行解析。

例如:

[dateFormatter setDateFormat:@"MMMM d, yyyy"];
NSDate *date = [dateFormatter dateFromString:cDate];
if (date == nil) {
    [dateFormatter setDateFormat:@"yyyy-MM-dd"];
    date = [dateFormatter dateFromString:cDate];
    if (date == nil) {
        // Handle the situation where the date string could not be parsed
    }
}

我已经确认了这一点,尽管我认为cDate的格式可能是导致问题的原因。它被设置为:1972-01-01。当我的格式字符串为"yyyy-MM-dd"时,它可以正常工作。现在,由于格式字符串变成了"MMMM d, yyyy",程序就崩溃了。 - Coocoo4Cocoa
在分配给日期选择器之前,“date”的值是多少?它是否超出了选择器的最小和最大日期值? - Ecton
我相信问题在于NSDateFormatter不知道如何将格式为1990-01-01的日期转换成setDateFormat:@"MMMM d, yyyy",但是当格式字符串为"yyyy-MM-dd"时,它是可以完成转换的。 - Coocoo4Cocoa
问题在于日期格式化程序的格式被设置为MMMM d,yyyy,但您正在以不同的格式提供日期。我猜想,如果您回答我的问题,您会注意到“date”是一个无效值。您需要使用匹配的格式字符串解析日期。 - Ecton
你能否解释一下“使用匹配格式字符串解析日期”的意思? - Coocoo4Cocoa
如果你的日期是“1972-01-01”,那么它只能被“yyyy-MM-dd”的格式解析。因此,你必须使用该格式进行解析。如果你想接受两种格式,你将不得不先尝试一种格式,然后再尝试使用另一种格式进行解析。 - Ecton

-1

如果您的调用

NSDate *date = [dateFormatter dateFromString:cDate];

失败,日期为空。

这在文档中没有写明。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接