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

голоса
8

Я пытался найти разумный способ хранения ежедневных данных с использованием основных данных на iPhone.

Мое приложение получает данные в формате CSV, с датой, но нет времени:

date, cycles
2009-08-01, 123
2009-08-02, 234
2009-08-03, 345
2009-08-04, 456

Когда эти данные сохраняются, должна быть только одна запись в день. Я понял, что лучше всего сделать, это создать NSDate для хранения, но полоса из данных часовых поясов и времени.

Я могу легко создать NSDate без часов, минут или секунд , используя либо NSDateComponents или NSDateFormatter. Однако , даже когда я установить часовой пояс явно UTC или ноль секунды по Гринвичу, выводя дату создания с NSLog () всегда имеет свой местный часовой пояс , как:

2009-07-29 00:00:00 +0100

Кто-нибудь знает лучшего способа сделать NSDates без компонентов времени? Или, возможно, лучший способ хранения даты?

Задан 05/08/2009 в 10:45
источник пользователем
На других языках...                            


3 ответов

голоса
9

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

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

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

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

Временные зоны на самом деле не имеет значения , когда вы просто имеем дело с датами, хотя. До тех пор , как вы убедитесь , что для установки часового пояса на время NSDateFormatterпо Гринвичу, вы всегда будете показывать ту же дату, независимо от того , в каком часовом поясе пользователь выбрал на своем устройстве.

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

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

Ответил 05/08/2009 в 15:59
источник пользователем

голоса
3

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

Ответил 05/08/2009 в 18:03
источник пользователем

голоса
2

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

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

По-прежнему используя NSDate вы используете класс, ядро ​​данные могут работать с изначально, то есть вы все еще можете использовать предикаты легко для фильтрации или сортировок неправдоподобных результатов по дате, не слишком трудно думать об этом.

Ответил 05/08/2009 в 12:03
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more