создавать DateComponents/NSDateComponents из String и наоборот

Есть ли (элегантный или предпочтительный) способ преобразовать объект DateComponents в строку и обратно, чтобы

DateComponents -> String -> DateComponents

всегда возможно и полученный объект равен исходному объекту? (не идентичны) (например, CustomStringRepresentable)

Для NSDate/Date есть NSDateFormatter/DateFormatter, которые умеют проделывать этот трюк, конвертируя туда-сюда.

Для DateComponents есть DateComponentsFormatter, но мне кажется, что направление от String к DateComponents не поддерживает.

мотивация для этого вопроса

HealthKit раньше сохранял дни рождения как NSDate до iOS 9.x.

Начиная с iOS 10 HealthKit использует DateComponents в качестве модели для дней рождения. (И устарело NSDate для дней рождения)

Я пытаюсь отразить изменение модели HealthKits в моей собственной модели данных приложения, ориентированного на HealthKit. Самый простой способ — использовать DateComponents в моей модели, как это делает HealthKit.

Поскольку мне нужно сохранить мою модель в файл и загрузить ее снова, ответ на этот вопрос позволит мне сделать это.

Очевидный запасной вариант — преобразовать DateComponents в Date и сохранить его. Но должна быть веская причина, по которой Apple не рекомендует Date для дней рождения.


person Gerd Castan    schedule 18.06.2016    source источник
comment
Не могли бы вы уточнить связь между компонентами и строкой соответственно формату строки.   -  person vadian    schedule 18.06.2016
comment
Меня не очень волнует формат String. Все, что работает. Было бы неплохо, если бы он был доступен для чтения разработчиком по причинам отладки.   -  person Gerd Castan    schedule 18.06.2016


Ответы (1)


Просто сохраните компоненты даты напрямую через NSKeyedArchiver, так как NSDateComponents соответствует NS(Secure)Coding.

person vadian    schedule 18.06.2016
comment
Спасибо за этот ответ. Я добавил мотивацию к своему вопросу из-за вашего ответа, чтобы показать, что расчеты даты не являются проблемой. Это найти строковое представление данных, которые Apple дает мне. - person Gerd Castan; 18.06.2016
comment
Извините за это, но вы не описали реальную проблему, когда задавали вопрос несколько часов назад. - person vadian; 18.06.2016
comment
Я спросил, как DateComponents должен быть представлен в виде строки и этой строки в DateComponents. Я не знал, что это вызовет ответы «Не делай этого». Извиняюсь. - person Gerd Castan; 18.06.2016
comment
Но в чем проблема? Класс (NS)Date вовсе не устарел. Изменилось только представление дня рождения. Таким образом, вы можете смело использовать мое предложение для преобразования DateComponents в String и наоборот. - person vadian; 18.06.2016
comment
Поскольку DateComponents имеет календарь как часть своей модели данных. Это может измениться (HK говорит, что в данный момент использует григорианский язык). И DateComponents может моделировать даты так, как не может NSDate. Поскольку Date не является устаревшим, причина для Apple должна заключаться в том, что DateComponents может представлять дни рождения так, как Date не может. (хотя я не знаю этой причины) - person Gerd Castan; 18.06.2016
comment
Кстати: NSDateComponents соответствует NS(Secure)Coding, поэтому вы можете сохранять компоненты даты напрямую через NSKeyedArchiver - person vadian; 18.06.2016
comment
вот так и работает. Спасибо :-) Если вы ответите на этот вопрос, я поставлю вам палец вверх :-) - person Gerd Castan; 18.06.2016
comment
ой. data.base64EncodedString().length = 2488. Но это работает - person Gerd Castan; 18.06.2016