从 String 创建 DateComponents / NSDateComponents,反之亦然

Posted

技术标签:

【中文标题】从 String 创建 DateComponents / NSDateComponents,反之亦然【英文标题】:create DateComponents / NSDateComponents from String and vice versa 【发布时间】:2016-06-18 11:50:34 【问题描述】:

是否有一种(优雅或首选的)方法可以将 DateComponents 对象转换为字符串并返回,以便

DateComponents -> String -> DateComponents

总是可能的并且结果对象等于原始对象? (不相同)(如CustomStringRepresentable

对于NSDate / Date 有一个NSDateFormatter / DateFormatter 能够做到这一点,来回转换。

对于DateComponents,有一个DateComponentsFormatter,但在我看来不支持从StringDateComponents 的方向。

这个问题的动机

HealthKit 用于将生日存储为 NSDate,直到 ios 9.x。

从 iOS 10 开始,HealthKit 使用DateComponents 作为生日模型。 (并且在生日时已弃用 NSDate

我试图在我自己的以 HealthKit 为中心的应用程序的数据模型中反映 HealthKits 模型的变化。最直接的方法是在我的模型中使用 DateComponents,就像 HealthKit 一样。

由于我需要将模型保存到文件中并再次加载,因此这个问题的答案将使我能够做到这一点。

明显的后备是将DateComponents 转换为Date 并保存。但是,Apple 在生日时弃用 Date 肯定是有充分理由的。

【问题讨论】:

能否请您详细说明组件和字符串之间的关系以及字符串格式。 我不太关心字符串格式。任何有效的东西。如果开发人员出于调试原因可以阅读它会很好。 【参考方案1】:

只需通过NSKeyedArchiver 直接保存日期组件,因为NSDateComponents 符合NS(Secure)Coding

【讨论】:

感谢您的回答。我为我的问题添加了动机,因为您的回答表明日期计算不是问题。它是找到苹果给我的数据的字符串表示。 很抱歉,您在几个小时前提出问题时没有描述实际问题。 我询问了如何将 DateComponents 表示为 String 以及如何将 String 表示为 DateComponents。我不知道这会触发“不要那样做”的答案。对不起。 但是问题出在哪里? (NS)Date 类根本不被弃用。只是生日表示发生了变化。所以你可以放心地使用我的建议将DateComponents 转换为String,反之亦然。 顺便说一句:NSDateComponents符合NS(Secure)Coding所以你可以直接通过NSKeyedArchiver保存日期组件

以上是关于从 String 创建 DateComponents / NSDateComponents,反之亦然的主要内容,如果未能解决你的问题,请参考以下文章

如何从String创建InputStream? [重复]

从输入迭代器创建 C++ std::string 的性能

从 String 创建 DateComponents / NSDateComponents,反之亦然

从 String 创建 DateComponents / NSDateComponents,反之亦然

Hive:从文本文件创建表。处理特殊字符

从 int8_t 数组创建 std::string