NSDate 到 NSString 的无损转换,反之亦然

Lossless conversion of NSDate to NSString and vice versa

我有一个 NSDate:

2015-07-13 16:04:01 +0000

并且我想将它转换为 NSString 以便能够将其存储在服务器上,然后从服务器读取它并转换回 NSDate 而不会丢失任何细节。

我一直在查看其他建议按如下方式执行此操作的帖子:

NSDateFormatter *dateFormatter = [NSDateFormatter new];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
NSString *dateString = [dateFormatter stringFromDate:date];

反之亦然:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"dd-MM-yyyy"];
NSDate *dateFromString = [dateFormatter dateFromString:message[@"date"]];

但这会导致格式丢失和妥协:

Jul 13, 2015

如何将 NSDate 转换为 NSString 并返回,最终得到准确的原始 NSDate?

您仅使用反映用户偏好的日期(而非时间)样式来格式化原始 NSDate,并且您仅使用日期、月份和年份来格式化检索到的 NSDate ,即 "dd-MM-yyyy"。你应该保持你的 NSDateFormatters 以保持原始格式。

两者都改变​​

[dateFormatter setDateFormat:@"dd-MM-yyyy"];

[dateFormatter setDateStyle:NSDateFormatterMediumStyle];

[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss Z"];

获取并保留完整的日期和时间格式。

NSDate 存储自参考日期以来的秒数。如果您仅使用 iOS 个应用程序。然后你调用一个方法返回那个秒数作为一个 NSTimeInterval 这是一个数字,然后你存储这个数字。这意味着绝对不会丢失信息。您的数据将以高于微秒的精度返回。

如果数据必须由不同的设备而不是 运行 iOS 读取,那么还有另一种方法返回自 1970 年 1 月 1 日以来的秒数。这是一种非常标准的格式,任何OS应该可以搞定。

存储数字而不是字符串似乎要好得多。