NSDateFormatter在调用datefromstring方法时返回nil?

时间:2017-09-23 04:02:43

标签: ios objective-c nsdateformatter

我尝试使用指定的格式化程序创建日期对象,但日期formatter_datefromstring方法返回nil。请通过清晰的文档样本告诉我们。我试图解析的字符串是在2017年9月24日太平洋时间上午2点和#34;提前致谢

    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setTimeZone:[NSTimeZone systemTimeZone]];
    [dateFormat setLocale:[NSLocale currentLocale]];
    [dateFormat setDateFormat:@"h:mm a Z 'on' MMMM d, yyyy"];
    NSLog(@"dateStr:==============> %@", dateStr);
    NSDate *date = [dateFormat dateFromString:dateStr];
    NSLog(@"Date:------------->%@", date);
    return date;

3 个答案:

答案 0 :(得分:1)

您使用的是错误的时区说明符。 Z适用于-0800等时区。对于z等短时区缩写,您需要PDT

此外,没有理由将格式化程序的本地设置为currentLocale,将时区设置为systemTimeZone,因为这些是默认值。当您解析的字符串包含时区信息时,格式化程序的时区无关紧要。

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"h:mm a z 'on' MMMM d, yyyy"];
NSLog(@"dateStr:==============> %@", dateStr);
NSDate *date = [dateFormat dateFromString:dateStr];
NSLog(@"Date:------------->%@", date);
return date;

但是,由于您正在解析使用英语的固定格式日期字符串,因此您应该将格式化程序的语言环境设置为en_US_POSIX的特殊语言环境。这将确保它处理英文月份名称,无论用户的区域设置如何。

[dateFormat setLocale:[NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"]];

答案 1 :(得分:0)

您能否检查dateStr日期格式和给定格式是否相同。如果两者的格式不同,则会得到nil对象。在下面给出的示例中尝试使用dateStr格式。

NSString *dateStr = @"10:23 am Z on September 30, 2017";
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setTimeZone:[NSTimeZone systemTimeZone]];
[dateFormat setLocale:[NSLocale currentLocale]];
[dateFormat setDateFormat:@"h:mm a Z 'on' MMMM d, yyyy"];
NSLog(@"dateStr:==============> %@", dateStr);
NSDate *date = [dateFormat dateFromString:dateStr];
NSLog(@"Date:------------->%@", date);

在控制台中你会得到 2017-09-23 09:54:04.654597 + 0530 Date [4068:79926] dateStr:==============> 2017年9月30日星期五上午10点23分 2017-09-23 09:54:04.657359 + 0530日期[4068:79926]日期:------------->周六9月30日15:53:00 2017

答案 2 :(得分:0)

使用以下语言环境避免返回nil值。

NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];

投票我的代码是否有用