我尝试使用指定的格式化程序创建日期对象,但日期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;
答案 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"];
投票我的代码是否有用