2014-03-26 130 views
1

我试图解析的格式传递日期:NSDateFormatter返回nil

"2014-03-26T05:07:42.14286Z" 

NSDateFormatter代码如下所示

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'SS'Z'"]; 
self.createdAt = [dateFormatter dateFromString:@""2014-03-26T05:07:42.14286Z""]; 

,但它只是返回nil。我已经尝试了多种变化,但没有滴答,但我似乎错过了一些东西。我是否错误地使用NSDateFormatter,误解蜱或其他东西的使用?

+1

放在本地,并且您的格式不你的榜样的管理 “'.14286'”。 – Larme

+0

@Larme你的意思是语言环境,为什么?它会默认为当前的语言环境,在这种情况下罚款。 – rmaddy

+0

不要在格式字符串中引用'Z'。这是时区,你希望它解析,而不是作为一个文字处理。 – rmaddy

回答

6

如果给定字符串不符合预期格式,格式化程序返回nil。您的格式字符串几乎是正确的,你只需要:

  • 撇号应该只用于文字
  • 毫秒应被指定为“SSS”,并匹配分离(使用SS.SSS)

正确的格式字符串是:

NSDateFormatter *df = [[NSDateFormatter alloc] init]; 
[df setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"]; 
NSDate *d = [df dateFromString:@"2014-03-26T05:07:42.14286Z"]; 
+0

据我所知,你刚刚改变了变量名(但并不一致),并且删除了'-'和':'的引用,这两个引用都很好。还有什么我错过了?你测试过了吗? –

+0

对不起,我纠正了答案。我刚刚测试过它,它的工作原理 – vdaubry

+0

没错 - 那好些,但如果你给出了解释性文本,而不仅仅是一段代码,它会更好。我认为问题实际上只是OP的格式没有包含任何关于小数秒的内容。 (我认为将时区设置为UTC是值得的,因为我们将Z作为文字匹配。) –

0

只需更换下面一行的修饰线

[dateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'SS'Z'"]; 

修改行: -

[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSSZ"];