Передовой опыт NSDate при создании даты с без элемента времени

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

+ (NSDate *)dateWithNoTime:(NSDate *)dateTime {
if( dateTime == nil ) {
    dateTime = [NSDate date];
}
NSDateComponents* comps = [[NSCalendar currentCalendar] components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:dateTime];
NSDate *dateOnly = [[NSCalendar currentCalendar] dateFromComponents:comps];
[dateOnly dateByAddingTimeInterval:(60.0 * 60.0 * 12.0)];           // Push to Middle of day.
return dateOnly;

}

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

Я немного нервничаю, так как не совсем уверен, какой эффект будет иметь изменение часового пояса или локали. Будет ли это работать?

Что считается наилучшей практикой при хранении и поиске даты только тогда, когда вас не интересует время.

Ура.

ИЗМЕНИТЬ

После прочтения рекомендованного обсуждения я думаю, что мне следует изменить свой код следующим образом. Мысль заключается в том, что если я гарантирую, что я перенесу его в конкретную календарную систему и конкретный часовой пояс (UTC), тогда даты всегда должны быть одинаковыми, независимо от того, где вы находитесь, когда устанавливаете дату и когда читаете дату. Приветствуются любые комментарии к этому новому коду.

+ (NSDate *)dateWithNoTime:(NSDate *)dateTime {
if( dateTime == nil ) {
    dateTime = [NSDate date];
}

NSCalendar       *calendar   = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
[calendar setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
NSDateComponents *components = [[[NSDateComponents alloc] init] autorelease];
components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit
                         fromDate:dateTime];

NSDate *dateOnly = [calendar dateFromComponents:components];

[dateOnly dateByAddingTimeInterval:(60.0 * 60.0 * 12.0)];           // Push to Middle of day.
return dateOnly;

}

8
задан SimonB 1 December 2010 в 16:48
поделиться