Наиболее эффективный способ преобразования объекта NSDate с заданным временем в объект с тем же временем и текущей датой - PullRequest
1 голос
/ 28 февраля 2011

В настоящее время я создаю приложение планирования, которое работает с расписанием школ. Каждое расписание имеет массив объектов периода, который содержит время начала и окончания. В настоящее время я храню эти времена как объекты NSDate, где только время действительно имеет значение, и каждый объект NSDate имеет произвольную дату, связанную с ним, которая в значительной степени незначительна для моего приложения (это все, что назначает UIDatePicker, но я использую только TimePickerMode ). Я делаю несколько вещей с этими датами. Во-первых, я использую NSDateFormatter для вывода строкового представления времени для каждого периода в UITableView. Затем я также пытаюсь найти текущий период дня, сравнивая текущее время, извлеченное с помощью [Дата NSDate], с временем начала и окончания. Но у меня проблемы с выбором лучшего способа сделать это.

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

Другими возможными способами могут быть преобразование каждого NSDate в NSDateComponents, а затем использование NSCalendar для преобразования этого обратно в NSDate с текущей датой и тем же исходным временем.

Или я мог бы использовать другой подход и вообще отказаться от техники хранения NSDate. Вместо этого я мог бы хранить каждое время начала и окончания как NSDateComponents, тогда было бы достаточно просто вывести отформатированную версию времени для UITableView, а затем я мог бы преобразовать дату, полученную с помощью [NSDate date], в NSDateComponents для использования для сравнения для получения текущего периода.

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

Ответы [ 2 ]

1 голос
/ 28 февраля 2011

Проблема с использованием NSDate для хранения времени суток заключается в том, что его значение зависит от часового пояса.Если часовой пояс или летнее время изменятся во время работы вашего приложения на переднем плане или в фоновом режиме, то все ваше время внезапно будет неправильным.То же самое, если вы действительно сохраните значения NSDate на диск.(Один из вариантов - установить часовой пояс вашего приложения по умолчанию на UTC, но тогда представление вашего приложения о «сейчас» будет неверным для пользователя).

Я бы сохранял время отдельно и реализовывал методы для преобразования в иот NSDate.Вы можете сохранить время, используя NSDateComponents, или вы можете просто сохранить его как одно целое число (например, минуты после полуночи), что упрощает сравнение в два раза.

При преобразовании минут в и из NSDate вы используете NSDateComponents, и вам нужно убедиться, что ваши UIDatePickers, NSCalendars и NSDateFormatters используют один и тот же часовой пояс, который по умолчанию является локальным часовым поясом.

0 голосов
/ 28 февраля 2011

Похоже, вы беспокоитесь о накладных расходах, которые NSDateFormatter в настоящее время накладывает на вашу программу для синхронизации дня ваших периодов и текущей даты.Но на самом деле, вам совсем не важна дата, вам просто нужно время с начала дня.

Почему бы не вырезать посредника?Сохраните время начала и окончания как NSTimeIntervals, которые на самом деле просто удваиваются.Измените время начала и окончания на 86 400 секунд в день, чтобы перевести время на просто время в секундах после начала нового дня.Вам не очень важно, какой день он представляет, за исключением того, что этот день представлен как секунда 0.

Затем, когда вы извлекаете текущую NSDate, изменяйте его NSTimeInterval на 86 400, чтобы получить время в секундах и сравнить егосохраненные значения периода.Единственное преобразование объекта, вовлеченное во весь процесс, будет использовать примитив timeIntervalSinceReferenceDate.Остальные - простые операторы модов и сравнений, и вы можете хранить номера периодов как простые NSTimeIntervals.

...