Как сохранить даты без времен в Базовых Данных

В то время как это верно, что id(object) получает адрес объекта в реализации CPython по умолчанию, это вообще бесполезно..., Вы не можете делать что-либо с адресом от чистого кода Python.

единственное время Вы на самом деле были бы в состоянии использовать адрес, из дополнительной библиотеки C..., в этом случае, это тривиально для получения адреса объекта, так как объекты Python всегда раздаются как C указатели.

8
задан Ben 5 August 2009 в 09:45
поделиться

3 ответа

Хорошее практическое правило программирования - всегда хранить даты в формате UTC. Неважно, используете ли вы Core Data или нет; вам все равно придется поработать, потому что классы дат Apple в значительной степени отстой.

Даты внутри представлены в виде числа секунд с момента начала отсчета, которым, как мне кажется, является 1 января 2001 г. 00:00:00 (хотя фактическая справочная дата не очень важна). Дело в том, что объекты NSDate всегда изначально находятся в формате UTC. Если даты, которые вы указываете в своем CSV-файле, являются локальными, вам нужно сделать что-то вроде этого, чтобы получить время в формате UTC:

NSDate *UTCDate = [localDate addTimeInterval:-[[NSTimeZone localTimeZone] secondsFromGMT]];

Затем я бы установил время на 00:00:00. Теперь вы сохраняете дату в полночь по всемирному координированному времени. В презентационных целях вы будете использовать NSDateFormatter , настроенный с указанием часового пояса по вашему выбору (системный часовой пояс используется по умолчанию, если вы его не укажете) для отображения этих дат.

Часовые пояса не имеют особого значения когда ты просто имеешь дело со свиданиями. Если вы установите часовой пояс на NSDateFormatter на UTC, вы всегда будете показывать одну и ту же дату, независимо от того, какой часовой пояс выбрал пользователь на своем устройстве.

Если вы не нравится это решение, вы всегда можете сохранить свои даты в альтернативном формате. Вы можете использовать double или int для хранения даты в некотором настраиваемом формате (например, количество дней с некоторой контрольной даты), или вы даже можете создать собственный класс, чтобы смоделировать дату точно так, как вы хотите, и сохранить ее как объект NSData . Пока класс реализует NSCoding , вы можете сериализовать его в объект NSData в Core Data. Вам просто нужно установить тип атрибута в Core Data на «Transformable».

У вас есть масса вариантов, и ни один из них не требует написания ваших собственных запросов SQLite и баз данных.

9
ответ дан 5 December 2019 в 12:11
поделиться

NSDate не имеет часового пояса. NSLog использует ваш местный часовой пояс; там написано +0100, потому что вы здесь.

3
ответ дан 5 December 2019 в 12:11
поделиться

Объект NSDate всегда будет включать дату времени - если цитировать документы, он «представляет [s] один момент времени» и делает это, сохраняя значение времени с его ссылочной даты (начало от 1 января 2001 г. по Гринвичу, опять же согласно документам). Следовательно, у вас не может быть NSDate, который не знает времени суток.

Вместо того, чтобы пытаться сохранять даты по-своему, я бы все равно использовал NSDate в вашей модели и подумал о добавлении пары методов в ваш класс сущности, один из которых сделает то, что вы описали выше, установив NSDate на 00:00:00 в данный день. Другой может вернуть только дату из NSDate в предпочитаемом вами формате. Затем они будут использовать генерируемые Core Data средства получения и установки для доступа к свойству NSDate.

По-прежнему используя NSDate, вы используете класс, с которым Core Data может работать изначально,

2
ответ дан 5 December 2019 в 12:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: