NSDate dateFromString 2个月错了吗?

时间:2014-01-31 23:28:32

标签: ios objective-c nsdate nsdateformatter

我有以下代码:

NSDateFormatter *dateFormater = [[NSDateFormatter alloc] init];
[dateFormater setDateFormat:@"yyyy-MM-DD HH:mm:ss"];
[dateFormater setLocale:[NSLocale currentLocale]];
[dateFormater setTimeZone:[NSTimeZone systemTimeZone]];
NSDate *localDate = [dateFormater dateFromString:localUpdate];
NSDate *serverDate = [dateFormater dateFromString:serverUpdate];

localUpdate和serverUpdate的输入字符串是:

2014-01-31 23:42:17
2014-02-01 00:09:37

将NSString转换为NSDate时,第二个落后2个月?

2014-01-31 22:42:17 +0000
2013-12-31 23:09:37 +0000

任何人都能解释一下吗?

xCodelog

2 个答案:

答案 0 :(得分:4)

检查此行:

[dateFormater setDateFormat:@"yyyy-MM-DD HH:mm:ss"];

正确的日期格式是@" yyyy-MM-dd HH:mm:ss"用" dd"不是" DD"

我曾经遇到同样的问题......如果日期格式不正确,当您使用dateFormatter时,它会减去或添加一个月的日期。

答案 1 :(得分:3)

您的日期格式字符串"yyyy-MM-DD HH:mm:ss"不太正确。

您告诉NSDateFormatter将第二个示例中的01解析为一年中的某一天(DD)而不是月中的某一天(dd ),你想要的。

yyyy-MM-DD HH:mm:ss
2014-02-01 00:09:37
        ^^~~~~~~~~~~~ these digits are being parsed as day of year rather
                      than as day of month

这是一个容易犯的错误,而且你的第一个例子令人困惑地隐藏了这个错误,其中月份和日期的日期是相同的。

有关iOS 6及更高版本使用的日期格式,请参阅Unicode reference。 (对于旧版本,请在Apple's documentation中选择正确的链接。)

学术切线:为什么NSDateFormatter将第二个日期解释为2013年的最后一天(而不是2014年的第一天,如指定的那样)可能是指定一个月一年中的一天(相互排斥),解析器中的错误(解释一年中的-01天),或时区或夏令时详细信息(如果规则在当地午夜更改)时区。)