- [NSDateFormatter dateFromString:]返回nil

时间:2011-05-23 09:36:35

标签: ios objective-c cocoa-touch nsdateformatter

    NSString *lower = [NSString stringWithFormat:@"%@",[newDates objectAtIndex:0]];
    NSString *higher = [NSString stringWithFormat:@"%@",[newDates objectAtIndex:[newDates count]-1]];
    NSLog(@"%@",lower);
    NSLog(@"%@",higher);

    NSDateFormatter *df = [[NSDateFormatter alloc] init];
    [df setDateFormat:@"yyyy-MM-dd"];
    NSDate *dtLower = [df dateFromString:lower];

    NSDate *dtHigher = [df dateFromString:higher];
    [df release];
    NSDateFormatter *df1 = [[NSDateFormatter alloc] init];
    [df1 setDateFormat:@"yyyy-MM-dd"];
    NSString * lowerDate = [df1 stringFromDate:dtLower];
    NSString * higherDate = [df1 stringFromDate:dtHigher];
    UILabel *dateLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 31, self.view.frame.size.width, 30)];
    [dateLabel setTextColor:[UIColor grayColor]];
    dateLabel.text = [NSString stringWithFormat:@"%@ - %@",lowerDate,higherDate];
    [self.view addSubview:dateLabel];

控制台中lowerhigher的输出为:

2011-05-23 14:55:52.767 Vocab[4225:207] 2011-05-23 03:58:22
2011-05-23 14:55:53.781 Vocab[4225:207] 2011-05-23 07:14:56

这里的代码对我不起作用。 higherlower的值不为null,但是当我尝试使用NSDateFormatter将其转换为NSDate时,它返回nil。

所以dtLowerdtHigher返回nil

可能出现什么问题?

3 个答案:

答案 0 :(得分:8)

尝试设置[df setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

答案 1 :(得分:3)

 [df setDateFormat:@"yyyy-MM-dd hh:mm:ss"];

您的第一个日期格式错误。

答案 2 :(得分:3)

如果您正在使用用户可见日期,则应避免设置日期格式字符串,因为很难预测您的格式字符串将如何在所有可能的用户配置中表达。相反,您应该尝试将自己限制为设置日期和时间样式(通过-[NSDateFormatter setDateStyle:]-[NSDateFormatter setTimeStyle:])

如果您正在使用固定格式日期,则应首先将日期格式化程序的区域设置设置为适合您的固定格式的区域设置。在大多数情况下,要选择的最佳区域设置是en_US_POSIX,这是一种专门用于产生美国英语结果的区域设置,无论用户和系统偏好如何。 en_US_POSIX在时间和机器之间也是不变的(en_US_POSIX在iOS上与在OSX上的工作方式相同,就像在其他平台上一样。)

en_US_POSIX设置为日期格式化程序的区域设置后,您可以设置日期格式字符串,日期格式化程序将对所有用户保持一致。

上述信息及其他信息可以在Apple的Technical Q&A QA1480

中找到

以下是一段代码,它实现了上述技术说明中的建议:

static NSDateFormatter* dateFormatter = nil;
if (!dateFormatter) 
{
   dateFormatter = [NSDateFormatter new];

   NSLocale *enUSPOSIXLocale = [[NSLocale alloc]  
                                 initWithLocaleIdentifier:@"en_US_POSIX"];

   [dateFormatter setLocale:enUSPOSIXLocale];
   [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
   dateFormatter.dateFormat = @"EEE, dd MMM yyyy HH:mm:ss +0000";
}