编辑:重读你的问题,我认为除了其他任何东西之外,你还有一个概念上的误解:
我有几个 NSDate 对象,其中包含符合以下格式的值
据我所知(诚然,我不是 Objective-C 程序员)一个NSDate
对象对格式化一无所知。它只代表一个瞬间。它不知道它是从文本中解析出来的还是以其他方式创建的。
这就像int
- 一个int
变量不是十进制或十六进制,它只是一个数字。当你格式化和解析你指定的时候。同样,您在解析和格式化时NSDateFormatter
用来描述您想要的格式。
您目前只有一个 NSDateFormatter
- 您正在将格式设置为"yyyy-MM-dd'T'HH:mm:ss.SSS"
然后在调用之前将其重置dateFromString
。您已将格式指定modelObj.createdDate
为 ISO-8601 格式的代码片段,但随后尝试使用“MMM dd, yyyy HH:mm”格式对其进行解析。
我建议你有两个单独的NSDateFormatter
对象:
NSDateFormatter *isoFormat = [[NSDateFormatter alloc] init];
[isoFormat setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSS"];
NSString *createdDateStr = [format stringFromDate:modelObj.createdDate];
NSDateFormatter *shortFormat = [[NSDateFormatter alloc] init];
[shortFormat setDateFormat:@"MMM dd, yyyy HH:mm"];
NSDate *parsedDate = [isoFormat dateFromString:createdDateStr];
NSLog(@"========= REal Date %@",[shortFormat stringFromDate:parsedDate]);
请注意,我已将您的formattedDate
变量更改为parsedDate
,因为这才是真正的 -NSDate
通过解析文本创建的。
如评论中所述,除非您确实需要像这样格式化和解析,否则您不应该这样做。我包含了您所有的原始代码,只是为了展示如何格式化日期,然后用相同的NSDateFormatter
. 只需:
NSDateFormatter *shortFormat = [[NSDateFormatter alloc] init];
[shortFormat setDateFormat:@"MMM dd, yyyy HH:mm"];
NSLog(@"========= REal Date %@",[shortFormat stringFromDate:modelObj.createdDate]);
一般来说,您应该避免不必要的转换。从文本转换为更自然的数据类型(NSDate
在这种情况下,但同样适用于数字等)并在尽可能多的代码中使用该数据类型,仅在最后一刻转换为文本。