编辑:重读你的问题,我认为除了其他任何事情之外,你还存在概念上的误解:
我有几个 NSDate 对象,其中包含符合以下格式的值
据我所知(诚然,我不是 Objective-C 程序员)NSDate
对象不知道任何有关格式化的信息。它仅代表时间的一个瞬间。它不知道它是从文本中解析出来的还是以其他方式创建的。
这就像一个int
- an int
变量不是十进制或十六进制,它只是一个数字。当你格式化和解析时你就指定了。同样,你使用NSDateFormatter
描述你想要的格式在解析和格式化时.
您目前只有one NSDateFormatter
- 您将格式设置为"yyyy-MM-dd'T'HH:mm:ss.SSS"
then 重置在你打电话之前dateFromString
。您指定格式的代码片段modelObj.createdDate
成 ISO-8601 格式,但随后尝试parse它使用“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
它是通过解析文本创建的。
正如评论中所指出的,除非你真的need像这样格式化和解析,你不应该。我包含了您所有的原始代码只是为了展示您如何can格式化日期,然后用相同的方法重新解析它NSDateFormatter
。您将得到相同的结果:
NSDateFormatter *shortFormat = [[NSDateFormatter alloc] init];
[shortFormat setDateFormat:@"MMM dd, yyyy HH:mm"];
NSLog(@"========= REal Date %@",[shortFormat stringFromDate:modelObj.createdDate]);
一般来说,您应该避免不必要的转换。转变from文本转换为更自然的数据类型(NSDate
在这种情况下,但这同样适用于数字等),并在尽可能多的代码中使用该数据类型,仅在最后一刻转换为文本。